diff --git a/.gitignore b/.gitignore index ce5b7ea6..fab5a578 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,8 @@ compile_commands.json CTestTestfile.cmake _deps build +/**/Debug +/**/v16/* +*.db +*.suo +*.ipch diff --git a/README.md b/README.md index fda91fe4..6c781bbf 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,11 @@ In particular: * `doc/hoymiles-format-description.txt` is a detailed description of the communications format and the history of this project * `doc/getting-started-ESP8266.md` shows the hardware setup for an ESP8266-based system -* The `tools` folder contains various software tools for RaspberryPi, Arduino and ESP8266/ESP32 +* The `tools` folder contains various software tools for RaspberryPi, Arduino and ESP8266/ESP32: + * A [version for ESP8266](tools/esp8266) that includes a web interface + * A [version for Arduino Nano](tools/nano/NRF24_SendRcv) + * An [alternative Version of the above](tools/NRF24_SendRcv) + * A [different implementation](tools/HoyDtuSim) + * An [implementation for Raspberry Pi](tools/rpi) that polls an inverter and archives results as log files/stdout as well as posting them to an MQTT broker. Contributors are always welcome! diff --git a/doc/HM-400 data.xlsx b/doc/HM-400 data.xlsx new file mode 100755 index 00000000..2c1bf5e5 Binary files /dev/null and b/doc/HM-400 data.xlsx differ diff --git a/doc/Hoymiles-SerialNumbers.xlsx b/doc/Hoymiles-SerialNumbers.xlsx new file mode 100644 index 00000000..f0c808c8 Binary files /dev/null and b/doc/Hoymiles-SerialNumbers.xlsx differ diff --git a/doc/getting-started-ESP8266.md b/doc/getting-started-ESP8266.md index ad373047..d8ee683c 100644 --- a/doc/getting-started-ESP8266.md +++ b/doc/getting-started-ESP8266.md @@ -1,28 +1,47 @@ # Getting Started with an ESP8266 -``` Wire Connections +```ditaa +-----------+ +-----------+ - | nRF24L01+ |--colour--| ESP8266 | + | ESP8266 |--colour--| nRF24L01+ | | | | | - | GND |---black--| GND | - | VCC |----red---| +3.3V | - | CE |---grey---| D4 | - | CSN |--purple--| D8 | - | SCK |---blue---| D5 | - | MOSI |---green--| D7 | - | MISO |---brown--| D6 | - | IRQ |--yellow--| D3 | + | GND |---black--|[GND] | + | +3.3V |----red---| VCC | + | D4 |---grey---| CE | + | D8 |--purple--| CSN | + | D5 |---blue---| SCK | + | D7 |---green--| MOSI | + | D6 |---brown--| MISO | + | D3 |--yellow--| IRQ | +-----------+ +-----------+ ``` ![plot](./AhoyMiles_bb.png) -See +Fritzing diagrams & schematics +* [AhoyMiles_bb.png](./AhoyMiles_bb.png) +* [AhoyMiles_schem.png](./AhoyMiles_schem.png) +* [AhoyMiles.fzz](./AhoyMiles.fzz) + +Libraries to be installed in Arduino IDE: +* RF24 +* TimeLib -* AhoyMiles_bb.png -* AhoyMiles_schem.png -* AhoyMiles.fzz +Verify & Compile +* Connect to WiFi Network `ESP AHOY` +* Use password `esp_8266` +* Connect to Network settings -by "isnoAhoy" +Setup +* WiFi + * Enter SSID `mynetwork` + * Enter Password `mypassword` +* Device Host Name + * Enter Device Name `esp-ahoy` +* General + * Hoymiles Address (e.g. 114173123456) + * Choose inverter type + * Set individual inverter name + * [x] Reboot device after successful save +Save diff --git a/doc/hoymiles-format-description.txt b/doc/hoymiles-format-description.txt index 7ed155d0..5dec0f7b 100644 --- a/doc/hoymiles-format-description.txt +++ b/doc/hoymiles-format-description.txt @@ -1,560 +1,597 @@ -About this Document -=================== - -This description aims to document the data format that Hoymiles -micro inverters use to communicate their current operating state. - -The original Hoymiles setup requires connectivity to "the cloud", -see [this section below](#system-description). - -With the information documented here, it is possible to interact with -a set of Hoymiles micro inverters in a purely "offline" way, i.e. -without requiring internet access or any connectivity to a "cloud". - -The only required hardware is a Nordic "NRF24L01+" wireless module. - -The `ahoy` project at [5] collects software for various platforms, -including Aduino and RaspberryPi. - -> Note: Some of the sections in this document are (still) in German. Translations -> may be provided if and when necessary. - - -Origin, Contributors --------------------- - -The information in this document was gathered in a large community -effort which started out with [this post][1] -on the German [mikrocontroller.net][2] forum. - -As of April 2022, this effort is still ongoing. Not all details have -been documented yet, and not all secrets have been uncovered. - -Multiple members of the community have already successfully retrieved (and -continue to successfully retrieve) data from their Hoymiles micro inverters. - -Here's a list of some of the early contributors: - -- sorbit: created the original mikrocontroller.net thread -- Martin (Gast): DTU and RF analysis -- Hubi: protocol analysis -- Marcel: initial analysis and much logging and interpretation -- Pascal A. (pasarn): various datagram fields, crc8 -- Frank H. (fh_): discovered time_t -- Thomas B. (tbnobody): protocol analysis, logging -- Arnaldo G. (arnaldo_g): data capturing -- Oliver F (of22): protocol analysis, logging -- Martin G. (petersilie): protocol analysis, logging, RaspberryPi - - - -System Description -================== - -Ein Setup wie von Hoymiles vorgesehen, sieht wie folgt aus: - -- Eine "DTU" kommuniziert mit vielen Wechselrichtern. -- Die Kommunikation geht immer von der DTU aus: - DTU stellt Anfrage und erwartet eine Antwort vom WR. -- Dafür muss die DTU die Adressen (=Seriennummern) aller WR kennen. -- Diese werden der DTU im Rahmen eines Einrichtungsprozesses beigebracht. - -``` - Nordic - "Enh. Shockburst" - 2.4 GHz - \|/ <-----------------> \|/ - | | - +-------+ +-----------+ - | DTU | | MI-600 | - +-------+ +-----------+-+ - | MI-1500 | - +-----------+-+ - | MI-... | - +-----------+ - : - : - ABBILDUNG 1: Systemübersicht -``` - - -``` - Nordic - WLAN "Enh. Shockburst" - 2.4 GHz - \|/ \|/ - | | - +---------+ +-----------+ - | ESP8266 | | NRF24LE1E | - +---------+ +-----------+ - ^ ^ - | | - | +----------+ | - +-----> | GD32F303 | <-----+ - (B) +----------+ (C) - - ABBILDUNG 2: Innerer Aufbau "DTU" -``` - - -``` - Nordic - "Enh. Shockburst" - NRF24LE1E 2.4 GHz - +------------------+ \|/ - +----------+ | | | | - | GD32F303 | <----->| µC | NRF24L01+ |-------+ - +----------+ (C) | | | - +------+-----------+ - - ABBILDUNG 3: Detailansicht GD32F303 - NRF24LE1E -``` - - - -Adressierung -============ - -Die Seriennummern der DTU und der WR werden wie folgt als Adressen für die -Kommunikation verwendet: - -**Interne Kommunikation**: Die meisten Datenpakete enthalten Quell- und -Zieladresse der jeweiligen Gesprächspartner. Hier werden 4-Byte-Adressen -verwendet, die direkt aus den letzten 8 Stellen der Seriennummer des -Wechselrichters bzw. der DTU gewonnen werden: - -Beispiel: Seriennummer ....72818832 - -Innerhalb der Pakete auf (C) wird daraus die 4-Byte-Adresse -0x72, 0x81, 0x88, 0x32 gebildet. Das ist die BCD-Darstellung -der letzen 8 Dezimalziffern. - -**NRF24 addressing scheme**: Over the air, the inverters communicate using -the [Nordic "Enhanced Shockburst" Protocol][3] configured for -5-byte addresses. - -The inverter serial number is converted into a "Shockburst" address -as follows: - -- encode the final 8 digits of the serial number in BCD format: - `0x72, 0x81, 0x88, 0x32` -- reverse the order of the bytes: - `0x32, 0x88, 0x81, 0x72` -- append a byte containing 0x01: - `0x32, 0x88, 0x81, 0x72, 0x01` - -In this example, the resulting "Shockburst" address is: 0x3288817201. - -**Additional example**, this time for inverter with serial number 99973104619: - -The datasheet specifies the over-the-air packet format: "Most Significant Byte -(MSB) to the left" (cf [datasheet figure 11][3]) - - Address := Byte_4, Byte_3, Byte_2, Byte_1, Byte_0 - ("LSByte must be unique") - -so 0x1946107301 results in - - 19 46 10 73 01 "on the wire" - -Old-style NRF Libraries take uint64_t addresses. In this case, the correct -address to pass to the library would be (uint64_t)0x1946107301ULL. - -The ["Optimized high speed nRF24L01+ driver"][4] -actually wants `uint8_t*`, which maybe makes more sense. -But apparently it still wants the bytes in order LSB to MSB (even though the chip will -then put them out in MSB-to-LSB order. - -So in this case, the correct sequence of bytes to pass to the library -would be "\x01\x73\x10\x46\x19". - -Figure 4 below is an annotated example of an "Enhanced Shockburst" packet as -seen on the air. - -``` -+----------+--------------------+--------------------+---------------------+------------+ -| preamble | dst 5-byte-address | PCF (9-bit) | payload (>=1 bytes) | 2-byte-CRC | -+----------+--------------------+--------------------+---------------------+------------+ -| | | e.g. 0x0d8: | | | -| 0x55 | addr[4]...addr[0] | 0b011011 00 0 | | | -| or | MSB ... LSB | len=27 PID nACK | | | -| 0xAA | | | | | -| | | e.g. 0x0da | | | -| | | 0b011011 01 0 | | | -| | | len027 PID nACK | | | -+----------+--------------------+--------------------+---------------------+------------+ - -PCF: Packet control field -PID: Packet IDentification (to detect/avoid duplicates), cycles through 0...3 - - FIGURE 4: Enhanced Shockburst On-Air Data Format -``` - - - -Messages -======== - -Initial protocol analysis focused on the data exchanged on link (C) in figure (3). -Not all the frames observed on this link will result in an actual RF transmission, -and some translation/mangling/processing happens inside the NRF24LE1E, in particular - -- replacement of serial numbers -- recalculation of CRCs - -These packets (which are all framed in 0x7e...0x7f bytes) are described in section -[Encapsulated Packets](#encapsulated-packets) below. - -More recent efforts focus mainly on the actual "Enhanced Shockburst" packets -that are transmitted over the air. These packets are described in section -[Enhanced Shockburst Payloads](#Enhanced-Shockburst-Payloads), and the -information contained in this section is more up to date. - - - - -Encapsulated Packets --------------------- - -These are packets as observed on Link (C) in figure (3). - - -Nachricht: DTU an WR: "Init" (?) -``` ----------------------------------------------------------------------------------------------------------------------------------------------- - - 7E 07 00 00 00 00 00 00 00 00 00 07 7F - ^^ ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^ -Bedeutung SOF MID WR ser# WR ser# ? CRC8 EOF -``` - ? - - -Nachricht: DTU an WR: "Init 2" (?) -``` ----------------------------------------------------------------------------------------------------------------------------------------------- - - 7E 07 72 81 88 32 72 81 88 32 00 07 7F - ^^ ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^ -Bedeutung SOF MID DTU ser# DTU ser# ? CRC8 EOF -Einheit BCD (letzte 8) BCD (letzte 8) ? ? -Beispiel 72818832 72818832 ? -``` - - - -Nachricht 0x80: DTU an WR: "Zeit setzen" (?) -``` ----------------------------------------------------------------------------------------------------------------------------------------------- - |<-------------CRC16 'modbus' für CRC_M----------------->| - 7E 15 72 22 02 00 72 22 02 00 80 0B 00 62 09 04 9b 00 00 00 00 00 00 00 00 F2 68 F0 7F - ^^ ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^^^^^^^^^^ ^^^^^ ^^ ^^ -Bedeutung SOF MID WR ser# WR ser# CMD ? TIME (UTC) CRC_M CRC8 EOF -Einheit BCD (letzte 8) BCD (letzte 8) ? [s] HI LO -Beispiel 72220200 72220200 ? 2022-02-13 -``` - 13:16:11 - - -Nachricht 0x81: DTU an WR: "Anfrage DC-Daten" (?) -``` ----------------------------------------------------------------------------------------------------------------------------------------------- - -GD->NRF 7E 15 70 51 43 68 70 51 43 68 81 xx 7F ...... (NOCH NICHT VERIFIZIERT / GESEHEN) - ^^^^^^^^^^^ ^^ ^^ ^^ - | (wird von CMD CRC8 EOF - | NRF ersetzt) | (wird von NRF - v v neu berechnet) - -on-air 15 70 51 43 68 70 53 54 53 81 BA -(payload) ^^^^^^^^^^^ ^^^^^^^^^^^ - WR ser # DTU ser # -``` - - -Nachricht 0x82: DTU an WR: "Anfrage AC-Daten" (?) -``` ----------------------------------------------------------------------------------------------------------------------------------------------- - -GD->NRF 7E 15 70 51 43 68 70 51 43 68 82 xx 7F ...... (NOCH NICHT VERIFIZIERT / GESEHEN) - ^^^^^^^^^^^ ^^ ^^ ^^ - | (wird von CMD CRC8 EOF - | NRF ersetzt) | (wird von NRF - v v neu berechnet) - -on-air 15 70 51 43 68 70 53 54 53 82 B9 -(payload) ^^^^^^^^^^^ ^^^^^^^^^^^ - WR ser # DTU ser # -``` - - -Nachricht 0x83: DTU an WR: "Anfrage DC-Daten" (?) -``` ----------------------------------------------------------------------------------------------------------------------------------------------- - -GD->NRF 7E 15 70 51 43 68 70 51 43 68 83 xx 7F ...... (NOCH NICHT VERIFIZIERT / GESEHEN) - ^^^^^^^^^^^ ^^ ^^ ^^ - | (wird von CMD CRC8 EOF - | NRF ersetzt) | (wird von NRF - v v neu berechnet) - -on-air 15 70 51 43 68 70 53 54 53 83 B8 -(payload) ^^^^^^^^^^^ ^^^^^^^^^^^ - WR ser # DTU ser # -``` - - -Nachricht 0x85: DTU an WR: "???" (?) -``` ----------------------------------------------------------------------------------------------------------------------------------------------- - -GD->NRF 7E 15 70 51 43 68 70 51 43 68 85 xx 7F ...... (NOCH NICHT VERIFIZIERT / GESEHEN) - ^^^^^^^^^^^ ^^ ^^ ^^ - | (wird von CMD CRC8 EOF - | NRF ersetzt) | (wird von NRF - v v neu berechnet) - -on-air 15 70 51 43 68 70 53 54 53 85 BE -(payload) ^^^^^^^^^^^ ^^^^^^^^^^^ - WR ser # DTU ser # -``` - - -Nachricht 0xFF: DTU an WR: "???" (?) -``` ----------------------------------------------------------------------------------------------------------------------------------------------- - -GD->NRF 7E 15 70 51 43 68 70 51 43 68 FF xx 7F ...... (NOCH NICHT VERIFIZIERT / GESEHEN) - ^^^^^^^^^^^ ^^ ^^ ^^ - | (wird von CMD CRC8 EOF - | NRF ersetzt) | (wird von NRF - v v neu berechnet) - -on-air 15 70 51 43 68 70 53 54 53 FF C4 -(payload) ^^^^^^^^^^^ ^^^^^^^^^^^ - WR ser # DTU ser # -``` - - -Nachricht 0x01: WR an DTU: "Aktuelle DC Daten" (?) -``` ----------------------------------------------------------------------------------------------------------------------------------------------- - - 7E 95 72 22 02 00 72 22 02 00 01 00 01 01 4c 03 bd 0c 46 00 b5 00 03 00 05 00 00 BD 7F - ^^ ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^ ^^ -Bedeutung SOF MID WR ser# WR ser# CMD ? PV1.u PV1.i PV1.p PV2.u PV2.i PV2.p ? CRC8 EOF -Einheit BCD (letzte 8) BCD (letzte 8) ? [0.1V] [0.01A] [.1W] [0.1V] [0.01A] [.1W] ? -Beispiel 72220200 72220200 ? 33.2V 9.57A 317.2W 18.1V 0.03A 0.5W ? -``` - - -Nachricht 0x02: WR an DTU: "Aktuelle AC Daten" (?) -``` ----------------------------------------------------------------------------------------------------------------------------------------------- - - 7E 95 72 22 02 00 72 22 02 00 02 28 23 00 00 24 44 00 3C 00 00 09 0F 13 88 0B D5 83 7F - ^^ ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^^^^ ^^^^^ ^^^^^ ^^ ^^ -Bedeutung SOF MID WR ser# WR ser# CMD ? ? ? AC.u AC.f AC.p CRC8 EOF -Einheit BCD (letzte 8) BCD (letzte 8) ? [0.1V] [0.01Hz] [0.1W] -Beispiel 72220200 72220200 ? 9284 60 231.9V 50.00Hz 302.9W -``` - - -Nachricht 0x83: WR an DTU (?): "???" (nach CMD wäre das eher auch eine Antwort vom WR?) -``` ----------------------------------------------------------------------------------------------------------------------------------------------- - - 7E 95 72 22 02 00 72 22 02 00 83 00 03 00 83 03 E8 00 B2 00 0A FD 26 1E 7F - ^^ ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^ ^^ -Bedeutung SOF MID WR ser# WR ser# CMD ? ? ? ? ? ? CRC8 EOF -Einheit BCD (letzte 8) BCD (letzte 8) ? -Beispiel 72220200 72220200 ? 131 1000 178 10 -``` - - - -Hinweise --------- - -Die "on-air (payload)" Bytes geben nur die Nutzlast der gesendeten Shockburst-Pakete an. -Intern enthalten diese Pakete auch die Zieladresse, die Länge, eine CRC. - - - -***************************************************************************************************************************************************************************************** - - - -Enhanced Shockburst Payloads ----------------------------- - -- These are the packets that are exchanged between inverters and DTU via the Nordic - "Enhanced Shockburst" protocol. -- Each payload is preceded by a preamble, and terminated by a 16-bit CRC, as described - in the [Nordic datasheet][3]. See also figure 4 above. - - - -``` -CMD 0x80: DTU --> WR: "Set time/date" (?) ----------------------------------------------------------------------------------------------------------------------------------------------- - |<-------------CRC16 'modbus' für CRC_M----------------->| - 15 72220200 72220200 80 0B 00 62 09 04 9b 00 00 00 00 00 00 00 00 F2 68 F0 - ^^ ^^^^^^^^ ^^^^^^^^ ^^ ^^^^^ ^^^^^^^^^^^ ^^^^^ ^^^^^ ^^ -Name MID DTU_SER# DTU_SER# CMD uk1 TIME (local) SEQ? CRC_M CRC8 -Units see "addressing" ? [s-since-epoch] HI LO -Example 72220200 72220200 ? 2022-02-13 - 13:16:11 -``` -- This message will cause the inverter to transmit a CMD=0x01, CMD=0x02, and, occasionally, also a CMD=0x83 message - to the DTU with serial number DTU_SER#. -- Values of "0xb0, 0x00" and "0x11, 0x00" have been observed for "UK1". Their meaning is unknown. -- "SEQ" was observed to contain increasing numbers when sent by a Hoymiles DTU. In particular, - each issued "command" (e.g. "switch inverter on", "switch inverter off") appears to increase this - value. A constant value of 0x0000 or 0x0005 appears to work just fine. -- Repeatedly sending the same TIME information (instead of correctly increasing time) - [has been shown](https://www.mikrocontroller.net/topic/525778?page=2#7021386) to result - in identical behaviour, the inverter still replies as described above. - - -``` -CMD 0x01: WR --> DTU: "Current DC data" (?) (shown for an HM-700) ----------------------------------------------------------------------------------------------------------------------------------------------- - - 95 72 22 02 00 72 22 02 00 01 00 01 01 4c 03 bd 0c 46 00 b5 00 03 00 05 00 00 BD 7F - ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^ ^^ -NameMID WR ser# WR ser# CMD ? PV1.u PV1.i PV1.p PV2.u PV2.i PV2.p ? CRC8 EOF -Units BCD (letzte 8) BCD (letzte 8) ? [0.1V] [0.01A] [.1W] [0.1V] [0.01A] [.1W] ? -Example 72220200 72220200 ? 33.2V 9.57A 317.2W 18.1V 0.03A 0.5W ? -``` -- The exact meaning of the contents of this message varies depending on inverter type. So far, the following variants have been observed: - - HM-400 (single channel): - - HM-700 (2-channel): - - HM-1500 (4-channel): -``` -TODO TODO TODO -73109025 73109025 01 00 01 014F 0003 000B 0000 40AE 03AC 08E6 7C - ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ - 335 3 11 940 2278 - 33.5V 0.03A 1.1W 940W 22.78kW - -95 71603546 71603546 01 00 01 015D 004D 00B3 010C 0270 0001 3419 64 B327 B327 1 - ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ - 349 77 179 1 13337 - 34.9V 0.77A 1.79W 1 133.37kW -``` - - -``` -Nachricht 0x02: WR an DTU: "Aktuelle AC Daten" (?) ----------------------------------------------------------------------------------------------------------------------------------------------- - - 7E 95 72 22 02 00 72 22 02 00 02 28 23 00 00 24 44 00 3C 00 00 09 0F 13 88 0B D5 83 - ^^ ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^^^^ ^^^^^ ^^^^^ ^^ -Bedeutung SOF MID WR ser# WR ser# CMD ? ? ? AC.u AC.f AC.p CRC8 -Einheit BCD (letzte 8) BCD (letzte 8) ? [0.1V] [0.01Hz] [0.1W] -Beispiel 72220200 72220200 ? 9284 60 231.9V 50.00Hz 302.9W -``` -- The exact meaning of the contents of this message varies depending on inverter type. So far, the following variants have been observed: - - ... - -``` -Nachricht 0x83: WR an DTU (?): "???" (nach CMD wäre das eher auch eine Antwort vom WR?) ----------------------------------------------------------------------------------------------------------------------------------------------- - - 95 72 22 02 00 72 22 02 00 83 00 03 00 83 03 E8 00 B2 00 0A FD 26 1E - ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^ -Bedeutung MID WR ser# WR ser# CMD ? ? ? ? ? ? CRC8 -Einheit BCD (letzte 8) BCD (letzte 8) ? -Beispiel 72220200 72220200 ? 131 1000 178 10 -``` - - -Legend -====== - -**MID**: Message-ID. Antworten haben Bit 7 gesetzt, -``` - z.B. Frage 0x15 --> Antwort 0x95. - z.B. Frage 0x07 --> Antwort 0x87. - Für Kommunikation GD <--> NRF -``` - -**CMD**: - Befehl an den WR hat Bit 7 gesetzt - 0x80 "Zeit setzen" - 0x81 "Anfrage DC-Daten", erwartete Antwort: 0x01 - 0x82 "Anfrage AC-Daten", erwartete Antwort: 0x02 - 0x83 "?" - 0x85 "?" - 0xFF "?" - Antworten vom WR haben Bit 7 gelöscht: - 0x01 "Aktuelle DC-Daten" - 0x02 "Aktuelle AC-Daten" - -**SOF**: Start-of-Frame 0x7e - -**EOF**: End-of-Frame 0x7f - -**CRC8**: CRC8 mit poly=1 init=0 xor=0, für alle Bytes zwischen SOF und CRC8. - Beispiel in Python: -``` - >>> import crcmod - >>> f = crcmod.mkCrcFun(0x101, initCrc=0, xorOut=0) - >>> payload = bytes((0x95,0x72,0x22,0x02,0x00,0x72,0x22,0x02,0x00,0x83,0x00,0x03,0x00,0x83,0x03,0xE8,0x00,0xB2,0x00,0x0A,0xFD,0x26)) - >>> hex(f(payload)) - '0x1e' -``` - -**CRC_M**: CRC16 wie für "Modbus"-Protokoll, High-Byte gefolgt von Low-Byte - Beispiel in Python: -``` - >>> import crcmod - >>> f = crcmod.predefined.mkPredefinedCrcFun('modbus') - >>> payload = bytes((0x0B,0x00,0x62,0x2F,0x45,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)) - >>> hex(f(payload)) - '0x3bd6' -``` - -**TIME**: Aktuelle (DTU-)Zeit als Unix "time_t" (Sekunden seit 1970-01-01) - - -Glossary -======== - -**WR**: Wechselrichter (inverter) - -**DTU**: Data Terminal Unit (?). Die Hoymiles-Bezeichnung für den Kommunikations-Master. - -**BCD**: Binary Coded Decimal - - -Notizen -======= - -0x014c = 332 -0x03bd = 957 -0x0c64 = 3172 -0x6209049b = 1644758171 -datetime.datetime.utcfromtimestamp(0x6209049b): datetime.datetime(2022, 2, 13, 13, 16, 11) - - -References -========== - -- [1]: https://www.mikrocontroller.net/topic/525778 "The post that started the community effort" -- [2]: https://www.mikrocontroller.net "mikrocontroller.net" -- [3]: https://infocenter.nordicsemi.com/pdf/nRF24LE1_PS_v1.6.pdf "Nordic NRF24LE01+ datasheet" -- [4]: https://nrf24.github.io/RF24 "Optimized high speed nRF24L01+ driver documentation" -- [5]: https://github.com/grindylow/ahoy "AHOY Communications Project" - - -Revision History -================ - -2022-03-09 / Petersilie / erste Version -2022-03-10 / Petersilie / r2 / Nachrichten "02 28 23" und "82 00 03" ergänzt. Sauberer ausgerichtet. Python Beispiel für CRC. -2022-03-12 / Petersilie / r3 / Erste on-air Formate hinzu. CMD-IDs hinzu. Neue Nachrichten von arnaldo_g hinzu. Übersicht hinzu. -2022-03-15 / Petersilie / r4 / Nachricht 0x80: Mystery-Bytes am Ende "dechiffriert" -2022-03-16 / Petersilie / r5 / ESP ist ein ESP8266, nicht ESP32 (danke an @tbnobody) -2022-03-27 / Petersilie / all future revisions are now versioned via Git. +About this Document +=================== + +This description aims to document the data format that Hoymiles +micro inverters use to communicate their current operating state. + +The original Hoymiles setup requires connectivity to "the cloud", +see [this section below](#system-description). + +With the information documented here, it is possible to interact with +a set of Hoymiles micro inverters in a purely "offline" way, i.e. +without requiring internet access or any connectivity to a "cloud". + +The only required hardware is a Nordic "NRF24L01+" wireless module. + +The `ahoy` project at [5] collects software for various platforms, +including Aduino and RaspberryPi. + +> Note: Some of the sections in this document are (still) in German. Translations +> may be provided if and when necessary. + + +Origin, Contributors +-------------------- + +The information in this document was gathered in a large community +effort which started out with [this post][1] +on the German [mikrocontroller.net][2] forum. + +As of April 2022, this effort is still ongoing. Not all details have +been documented yet, and not all secrets have been uncovered. + +Multiple members of the community have already successfully retrieved (and +continue to successfully retrieve) data from their Hoymiles micro inverters. + +Here's a list of some of the early contributors: + +- sorbit: created the original mikrocontroller.net thread +- Martin (Gast): DTU and RF analysis +- Hubi: protocol analysis +- Marcel: initial analysis and much logging and interpretation +- Pascal A. (pasarn): various datagram fields, crc8 +- Frank H. (fh_): discovered time_t +- Thomas B. (tbnobody): protocol analysis, logging +- Arnaldo G. (arnaldo_g): data capturing +- Oliver F (of22): protocol analysis, logging +- Martin G. (petersilie): protocol analysis, logging, RaspberryPi + + + +System Description +================== + +Ein Setup wie von Hoymiles vorgesehen, sieht wie folgt aus: + +- Eine "DTU" kommuniziert mit vielen Wechselrichtern. +- Die Kommunikation geht immer von der DTU aus: + DTU stellt Anfrage und erwartet eine Antwort vom WR. +- Dafür muss die DTU die Adressen (=Seriennummern) aller WR kennen. +- Diese werden der DTU im Rahmen eines Einrichtungsprozesses beigebracht. + +``` + Nordic + "Enh. Shockburst" + 2.4 GHz + \|/ <-----------------> \|/ + | | + +-------+ +-----------+ + | DTU | | MI-600 | + +-------+ +-----------+-+ + | MI-1500 | + +-----------+-+ + | MI-... | + +-----------+ + : + : + ABBILDUNG 1: Systemübersicht +``` + + +``` + Nordic + WLAN "Enh. Shockburst" + 2.4 GHz + \|/ \|/ + | | + +---------+ +-----------+ + | ESP8266 | | NRF24LE1E | + +---------+ +-----------+ + ^ ^ + | | + | +----------+ | + +-----> | GD32F303 | <-----+ + (B) +----------+ (C) + + ABBILDUNG 2: Innerer Aufbau "DTU" +``` + + +``` + Nordic + "Enh. Shockburst" + NRF24LE1E 2.4 GHz + +------------------+ \|/ + +----------+ | | | | + | GD32F303 | <----->| µC | NRF24L01+ |-------+ + +----------+ (C) | | | + +------+-----------+ + + ABBILDUNG 3: Detailansicht GD32F303 - NRF24LE1E +``` + + + +Adressierung +============ + +Die Seriennummern der DTU und der WR werden wie folgt als Adressen für die +Kommunikation verwendet: + +**Interne Kommunikation**: Die meisten Datenpakete enthalten Quell- und +Zieladresse der jeweiligen Gesprächspartner. Hier werden 4-Byte-Adressen +verwendet, die direkt aus den letzten 8 Stellen der Seriennummer des +Wechselrichters bzw. der DTU gewonnen werden: + +Beispiel: Seriennummer ....72818832 + +Innerhalb der Pakete auf (C) wird daraus die 4-Byte-Adresse +0x72, 0x81, 0x88, 0x32 gebildet. Das ist die BCD-Darstellung +der letzen 8 Dezimalziffern. + +**NRF24 addressing scheme**: Over the air, the inverters communicate using +the [Nordic "Enhanced Shockburst" Protocol][3] configured for +5-byte addresses. + +The inverter serial number is converted into a "Shockburst" address +as follows: + +- encode the final 8 digits of the serial number in BCD format: + `0x72, 0x81, 0x88, 0x32` +- reverse the order of the bytes: + `0x32, 0x88, 0x81, 0x72` +- append a byte containing 0x01: + `0x32, 0x88, 0x81, 0x72, 0x01` + +In this example, the resulting "Shockburst" address is: 0x3288817201. + +**Additional example**, this time for inverter with serial number 99973104619: + +The datasheet specifies the over-the-air packet format: "Most Significant Byte +(MSB) to the left" (cf [datasheet figure 11][3]) + + Address := Byte_4, Byte_3, Byte_2, Byte_1, Byte_0 + ("LSByte must be unique") + +so 0x1946107301 results in + + 19 46 10 73 01 "on the wire" + +Old-style NRF Libraries take uint64_t addresses. In this case, the correct +address to pass to the library would be (uint64_t)0x1946107301ULL. + +The ["Optimized high speed nRF24L01+ driver"][4] +actually wants `uint8_t*`, which maybe makes more sense. +But apparently it still wants the bytes in order LSB to MSB (even though the chip will +then put them out in MSB-to-LSB order. + +So in this case, the correct sequence of bytes to pass to the library +would be "\x01\x73\x10\x46\x19". + +Figure 4 below is an annotated example of an "Enhanced Shockburst" packet as +seen on the air. + +``` ++----------+--------------------+--------------------+---------------------+------------+ +| preamble | dst 5-byte-address | PCF (9-bit) | payload (>=1 bytes) | 2-byte-CRC | ++----------+--------------------+--------------------+---------------------+------------+ +| | | e.g. 0x0d8: | | | +| 0x55 | addr[4]...addr[0] | 0b011011 00 0 | | | +| or | MSB ... LSB | len=27 PID nACK | | | +| 0xAA | | | | | +| | | e.g. 0x0da | | | +| | | 0b011011 01 0 | | | +| | | len027 PID nACK | | | ++----------+--------------------+--------------------+---------------------+------------+ + +PCF: Packet control field +PID: Packet IDentification (to detect/avoid duplicates), cycles through 0...3 + + FIGURE 4: Enhanced Shockburst On-Air Data Format +``` + + + +Messages +======== + +Initial protocol analysis focused on the data exchanged on link (C) in figure (3). +Not all the frames observed on this link will result in an actual RF transmission, +and some translation/mangling/processing happens inside the NRF24LE1E, in particular + +- replacement of serial numbers +- recalculation of CRCs + +These packets (which are all framed in 0x7e...0x7f bytes) are described in section +[Encapsulated Packets](#encapsulated-packets) below. + +More recent efforts focus mainly on the actual "Enhanced Shockburst" packets +that are transmitted over the air. These packets are described in section +[Enhanced Shockburst Payloads](#Enhanced-Shockburst-Payloads), and the +information contained in this section is more up to date. + + + + +Encapsulated Packets +-------------------- + +These are packets as observed on Link (C) in figure (3). + + +Nachricht: DTU an WR: "Init" (?) +``` +---------------------------------------------------------------------------------------------------------------------------------------------- + + 7E 07 00 00 00 00 00 00 00 00 00 07 7F + ^^ ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^ +Bedeutung SOF MID WR ser# WR ser# ? CRC8 EOF +``` + ? + + +Nachricht: DTU an WR: "Init 2" (?) +``` +---------------------------------------------------------------------------------------------------------------------------------------------- + + 7E 07 72 81 88 32 72 81 88 32 00 07 7F + ^^ ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^ +Bedeutung SOF MID DTU ser# DTU ser# ? CRC8 EOF +Einheit BCD (letzte 8) BCD (letzte 8) ? ? +Beispiel 72818832 72818832 ? +``` + + + +Nachricht 0x80: DTU an WR: "Zeit setzen" (?) +``` +---------------------------------------------------------------------------------------------------------------------------------------------- + |<-------------CRC16 'modbus' für CRC_M----------------->| + 7E 15 72 22 02 00 72 22 02 00 80 0B 00 62 09 04 9b 00 00 00 00 00 00 00 00 F2 68 F0 7F + ^^ ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^^^^^^^^^^ ^^^^^ ^^ ^^ +Bedeutung SOF MID WR ser# WR ser# CMD ? TIME (UTC) CRC_M CRC8 EOF +Einheit BCD (letzte 8) BCD (letzte 8) ? [s] HI LO +Beispiel 72220200 72220200 ? 2022-02-13 +``` + 13:16:11 + + +Nachricht 0x81: DTU an WR: "Anfrage DC-Daten" (?) +``` +---------------------------------------------------------------------------------------------------------------------------------------------- + +GD->NRF 7E 15 70 51 43 68 70 51 43 68 81 xx 7F ...... (NOCH NICHT VERIFIZIERT / GESEHEN) + ^^^^^^^^^^^ ^^ ^^ ^^ + | (wird von CMD CRC8 EOF + | NRF ersetzt) | (wird von NRF + v v neu berechnet) + +on-air 15 70 51 43 68 70 53 54 53 81 BA +(payload) ^^^^^^^^^^^ ^^^^^^^^^^^ + WR ser # DTU ser # +``` + + +Nachricht 0x82: DTU an WR: "Anfrage AC-Daten" (?) +``` +---------------------------------------------------------------------------------------------------------------------------------------------- + +GD->NRF 7E 15 70 51 43 68 70 51 43 68 82 xx 7F ...... (NOCH NICHT VERIFIZIERT / GESEHEN) + ^^^^^^^^^^^ ^^ ^^ ^^ + | (wird von CMD CRC8 EOF + | NRF ersetzt) | (wird von NRF + v v neu berechnet) + +on-air 15 70 51 43 68 70 53 54 53 82 B9 +(payload) ^^^^^^^^^^^ ^^^^^^^^^^^ + WR ser # DTU ser # +``` + + +Nachricht 0x83: DTU an WR: "Anfrage DC-Daten" (?) +``` +---------------------------------------------------------------------------------------------------------------------------------------------- + +GD->NRF 7E 15 70 51 43 68 70 51 43 68 83 xx 7F ...... (NOCH NICHT VERIFIZIERT / GESEHEN) + ^^^^^^^^^^^ ^^ ^^ ^^ + | (wird von CMD CRC8 EOF + | NRF ersetzt) | (wird von NRF + v v neu berechnet) + +on-air 15 70 51 43 68 70 53 54 53 83 B8 +(payload) ^^^^^^^^^^^ ^^^^^^^^^^^ + WR ser # DTU ser # +``` + + +Nachricht 0x85: DTU an WR: "???" (?) +``` +---------------------------------------------------------------------------------------------------------------------------------------------- + +GD->NRF 7E 15 70 51 43 68 70 51 43 68 85 xx 7F ...... (NOCH NICHT VERIFIZIERT / GESEHEN) + ^^^^^^^^^^^ ^^ ^^ ^^ + | (wird von CMD CRC8 EOF + | NRF ersetzt) | (wird von NRF + v v neu berechnet) + +on-air 15 70 51 43 68 70 53 54 53 85 BE +(payload) ^^^^^^^^^^^ ^^^^^^^^^^^ + WR ser # DTU ser # +``` + + +Nachricht 0xFF: DTU an WR: "???" (?) +``` +---------------------------------------------------------------------------------------------------------------------------------------------- + +GD->NRF 7E 15 70 51 43 68 70 51 43 68 FF xx 7F ...... (NOCH NICHT VERIFIZIERT / GESEHEN) + ^^^^^^^^^^^ ^^ ^^ ^^ + | (wird von CMD CRC8 EOF + | NRF ersetzt) | (wird von NRF + v v neu berechnet) + +on-air 15 70 51 43 68 70 53 54 53 FF C4 +(payload) ^^^^^^^^^^^ ^^^^^^^^^^^ + WR ser # DTU ser # +``` + + +Nachricht 0x01: WR an DTU: "Aktuelle DC Daten" (?) +``` +---------------------------------------------------------------------------------------------------------------------------------------------- + + 7E 95 72 22 02 00 72 22 02 00 01 00 01 01 4c 03 bd 0c 46 00 b5 00 03 00 05 00 00 BD 7F + ^^ ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^ ^^ +Bedeutung SOF MID WR ser# WR ser# CMD ? PV1.u PV1.i PV1.p PV2.u PV2.i PV2.p ? CRC8 EOF +Einheit BCD (letzte 8) BCD (letzte 8) ? [0.1V] [0.01A] [.1W] [0.1V] [0.01A] [.1W] ? +Beispiel 72220200 72220200 ? 33.2V 9.57A 317.2W 18.1V 0.03A 0.5W ? +``` + + +Nachricht 0x02: WR an DTU: "Aktuelle AC Daten" (?) +``` +---------------------------------------------------------------------------------------------------------------------------------------------- + + 7E 95 72 22 02 00 72 22 02 00 02 28 23 00 00 24 44 00 3C 00 00 09 0F 13 88 0B D5 83 7F + ^^ ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^^^^ ^^^^^ ^^^^^ ^^ ^^ +Bedeutung SOF MID WR ser# WR ser# CMD ? ? ? AC.u AC.f AC.p CRC8 EOF +Einheit BCD (letzte 8) BCD (letzte 8) ? [0.1V] [0.01Hz] [0.1W] +Beispiel 72220200 72220200 ? 9284 60 231.9V 50.00Hz 302.9W +``` + + +Nachricht 0x83: WR an DTU (?): "???" (nach CMD wäre das eher auch eine Antwort vom WR?) +``` +---------------------------------------------------------------------------------------------------------------------------------------------- + + 7E 95 72 22 02 00 72 22 02 00 83 00 03 00 83 03 E8 00 B2 00 0A FD 26 1E 7F + ^^ ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^ ^^ +Bedeutung SOF MID WR ser# WR ser# CMD ? ? ? ? ? ? CRC8 EOF +Einheit BCD (letzte 8) BCD (letzte 8) ? +Beispiel 72220200 72220200 ? 131 1000 178 10 +``` + + + +Hinweise +-------- + +Die "on-air (payload)" Bytes geben nur die Nutzlast der gesendeten Shockburst-Pakete an. +Intern enthalten diese Pakete auch die Zieladresse, die Länge, eine CRC. + + + +***************************************************************************************************************************************************************************************** + + + +Enhanced Shockburst Payloads +---------------------------- + +- These are the packets that are exchanged between inverters and DTU via the Nordic + "Enhanced Shockburst" protocol. +- Each payload is preceded by a preamble, and terminated by a 16-bit CRC, as described + in the [Nordic datasheet][3]. See also figure 4 above. + + + +``` +CMD 0x80: DTU --> WR: "Set time/date" (?) +---------------------------------------------------------------------------------------------------------------------------------------------- + |<-------------CRC16 'modbus' für CRC_M----------------->| + 15 72220200 72220200 80 0B 00 62 09 04 9b 00 00 00 00 00 00 00 00 F2 68 F0 + ^^ ^^^^^^^^ ^^^^^^^^ ^^ ^^^^^ ^^^^^^^^^^^ ^^^^^ ^^^^^ ^^ +Name MID DTU_SER# DTU_SER# CMD uk1 TIME (local) SEQ? CRC_M CRC8 +Units see "addressing" ? [s-since-epoch] HI LO +Example 72220200 72220200 ? 2022-02-13 + 13:16:11 +``` +- This message will cause the inverter to transmit a CMD=0x01, CMD=0x02, and, occasionally, also a CMD=0x83 message + to the DTU with serial number DTU_SER#. +- Values of "0xb0, 0x00" and "0x11, 0x00" have been observed for "UK1". Their meaning is unknown. +- "SEQ" was observed to contain increasing numbers when sent by a Hoymiles DTU. In particular, + each issued "command" (e.g. "switch inverter on", "switch inverter off") appears to increase this + value. A constant value of 0x0000 or 0x0005 appears to work just fine. +- Repeatedly sending the same TIME information (instead of correctly increasing time) + [has been shown](https://www.mikrocontroller.net/topic/525778?page=2#7021386) to result + in identical behaviour, the inverter still replies as described above. + + +``` +CMD 0x01: WR --> DTU: "Current DC data" (?) (shown for an HM-700 and HM-400) +---------------------------------------------------------------------------------------------------------------------------------------------- +HM-700 (2-channel): + 95 72 22 02 00 72 22 02 00 01 00 01 01 4c 03 bd 0c 46 00 b5 00 03 00 05 00 00 BD 7F + ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^ ^^ +NameMID WR ser# WR ser# CMD ? PV1.u PV1.i PV1.p PV2.u PV2.i PV2.p ? CRC8 EOF +Units BCD (letzte 8) BCD (letzte 8) ? [0.1V] [0.01A] [.1W] [0.1V] [0.01A] [.1W] ? +Example 72220200 72220200 ? 33.2V 9.57A 317.2W 18.1V 0.03A 0.5W ? + + +HM-400 (1-channel): +byte 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 + 95 73 10 xx yy 73 10 xx yy 01 00 01 01 9A 00 46 01 21 00 00 FA E6 00 84 09 0C F5 DD BD 7F + ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^ ^^ +NameMID WR ser# WR ser# CMD ? PV1.u PV1.i PV1.p DC? P total? DC? P day V AC CRC8 EOF +Units BCD (letzte 8) BCD (letzte 8) ? [0.1V] [0.01A] [.1W] [0.001kWh] [1Wh] [0.1V] ? +Example 7310xxyy 7310xxyy ? 41.0V 0.70A 28.9W 64.23kWh 132Wh 231.6V ? + +legend +PVx.u: DC voltage of panel x +PVx.i: DC current of panel x +PVx.p: DC power of panel x +WR ser#: inverter serial, e.g. 11217310xxyy (HM-400) => 7310xxyy +P tot: DC (or AC)? power total (monthly/yearly?) +P day: DC (or AC)? power daily +V AC: AC voltage + +``` +- The exact meaning of the contents of this message varies depending on inverter type. So far, the following variants have been observed: + - HM-400 (single channel): + - HM-700 (2-channel): + - HM-1500 (4-channel): +``` +TODO TODO TODO +73109025 73109025 01 00 01 014F 0003 000B 0000 40AE 03AC 08E6 7C + ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ + 335 3 11 940 2278 + 33.5V 0.03A 1.1W 940W 22.78kW + +95 71603546 71603546 01 00 01 015D 004D 00B3 010C 0270 0001 3419 64 B327 B327 1 + ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ + 349 77 179 1 13337 + 34.9V 0.77A 1.79W 1 133.37kW +``` + + +``` +Nachricht 0x02: WR an DTU: "Aktuelle AC Daten" (?) +---------------------------------------------------------------------------------------------------------------------------------------------- + + 7E 95 72 22 02 00 72 22 02 00 02 28 23 00 00 24 44 00 3C 00 00 09 0F 13 88 0B D5 83 + ^^ ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^^^^ ^^^^^ ^^^^^ ^^ +Bedeutung SOF MID WR ser# WR ser# CMD ? ? ? AC.u AC.f AC.p CRC8 +Einheit BCD (letzte 8) BCD (letzte 8) ? [0.1V] [0.01Hz] [0.1W] +Beispiel 72220200 72220200 ? 9284 60 231.9V 50.00Hz 302.9W +``` +- The exact meaning of the contents of this message varies depending on inverter type. So far, the following variants have been observed: + - until now, message never observed using a HM-400 + +``` +CMD 0x82: WR --> DTU: "???" (?) (shown for an HM-400) +---------------------------------------------------------------------------------------------------------------------------------------------- +HM-400 (1-channel): +byte 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 + 95 73 10 xx yy 73 10 xx yy 82 13 8A 01 1C 00 00 00 0C 03 E8 00 65 00 06 3C 1D 36 9E 8D 1 + ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^ ^^ +NameMID WR ser# WR ser# CMD Freq P AC ? I AC ? Temp ? ? ? CRC8? EOF? +Units BCD (letzte 8) BCD (letzte 8) [0.01Hz] [0.1W] ? [0.01A] ? [0.1°C] ? ? ? +Example 7310xxyy 7310xxyy 50,02Hz 28,40W ? 0,120A ? 10,10°C ? ? ? + +legend +Freq: frequency of inverter +P AC: AC power of inverter +I AC: AC current of inverter +Temp: temperature of inverter +WR ser#: inverter serial, e.g. 11217310xxyy (HM-400) => 7310xxyy + +``` +Nachricht 0x83: WR an DTU (?): "???" (nach CMD wäre das eher auch eine Antwort vom WR?) +---------------------------------------------------------------------------------------------------------------------------------------------- + + 95 72 22 02 00 72 22 02 00 83 00 03 00 83 03 E8 00 B2 00 0A FD 26 1E + ^^ ^^^^^^^^^^^ ^^^^^^^^^^^ ^^ ^^ +Bedeutung MID WR ser# WR ser# CMD ? ? ? ? ? ? CRC8 +Einheit BCD (letzte 8) BCD (letzte 8) ? +Beispiel 72220200 72220200 ? 131 1000 178 10 +``` + + +Legend +====== + +**MID**: Message-ID. Antworten haben Bit 7 gesetzt, +``` + z.B. Frage 0x15 --> Antwort 0x95. + z.B. Frage 0x07 --> Antwort 0x87. + Für Kommunikation GD <--> NRF +``` + +**CMD**: + Befehl an den WR hat Bit 7 gesetzt + 0x80 "Zeit setzen" + 0x81 "Anfrage DC-Daten", erwartete Antwort: 0x01 + 0x82 "Anfrage AC-Daten", erwartete Antwort: 0x02 + 0x83 "?" + 0x85 "?" + 0xFF "?" + Antworten vom WR haben Bit 7 gelöscht: + 0x01 "Aktuelle DC-Daten" + 0x02 "Aktuelle AC-Daten" + +**SOF**: Start-of-Frame 0x7e + +**EOF**: End-of-Frame 0x7f + +**CRC8**: CRC8 mit poly=1 init=0 xor=0, für alle Bytes zwischen SOF und CRC8. + Beispiel in Python: +``` + >>> import crcmod + >>> f = crcmod.mkCrcFun(0x101, initCrc=0, xorOut=0) + >>> payload = bytes((0x95,0x72,0x22,0x02,0x00,0x72,0x22,0x02,0x00,0x83,0x00,0x03,0x00,0x83,0x03,0xE8,0x00,0xB2,0x00,0x0A,0xFD,0x26)) + >>> hex(f(payload)) + '0x1e' +``` + +**CRC_M**: CRC16 wie für "Modbus"-Protokoll, High-Byte gefolgt von Low-Byte + Beispiel in Python: +``` + >>> import crcmod + >>> f = crcmod.predefined.mkPredefinedCrcFun('modbus') + >>> payload = bytes((0x0B,0x00,0x62,0x2F,0x45,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00)) + >>> hex(f(payload)) + '0x3bd6' +``` + +**TIME**: Aktuelle (DTU-)Zeit als Unix "time_t" (Sekunden seit 1970-01-01) + + +Glossary +======== + +**WR**: Wechselrichter (inverter) + +**DTU**: Data Terminal Unit (?). Die Hoymiles-Bezeichnung für den Kommunikations-Master. + +**BCD**: Binary Coded Decimal + + +Notizen +======= + +0x014c = 332 +0x03bd = 957 +0x0c64 = 3172 +0x6209049b = 1644758171 +datetime.datetime.utcfromtimestamp(0x6209049b): datetime.datetime(2022, 2, 13, 13, 16, 11) + + +References +========== + +- [1]: https://www.mikrocontroller.net/topic/525778 "The post that started the community effort" +- [2]: https://www.mikrocontroller.net "mikrocontroller.net" +- [3]: https://infocenter.nordicsemi.com/pdf/nRF24LE1_PS_v1.6.pdf "Nordic NRF24LE01+ datasheet" +- [4]: https://nrf24.github.io/RF24 "Optimized high speed nRF24L01+ driver documentation" +- [5]: https://github.com/grindylow/ahoy "AHOY Communications Project" + + +Revision History +================ + +2022-03-09 / Petersilie / erste Version +2022-03-10 / Petersilie / r2 / Nachrichten "02 28 23" und "82 00 03" ergänzt. Sauberer ausgerichtet. Python Beispiel für CRC. +2022-03-12 / Petersilie / r3 / Erste on-air Formate hinzu. CMD-IDs hinzu. Neue Nachrichten von arnaldo_g hinzu. Übersicht hinzu. +2022-03-15 / Petersilie / r4 / Nachricht 0x80: Mystery-Bytes am Ende "dechiffriert" +2022-03-16 / Petersilie / r5 / ESP ist ein ESP8266, nicht ESP32 (danke an @tbnobody) +2022-03-27 / Petersilie / all future revisions are now versioned via Git. diff --git a/tools/HoyDtuSim/CircularBuffer.h b/tools/HoyDtuSim/CircularBuffer.h new file mode 100644 index 00000000..a7fafdb7 --- /dev/null +++ b/tools/HoyDtuSim/CircularBuffer.h @@ -0,0 +1,158 @@ +/* + CircularBuffer - An Arduino circular buffering library for arbitrary types. + + Created by Ivo Pullens, Emmission, 2014 -- www.emmission.nl + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef CircularBuffer_h +#define CircularBuffer_h + +#ifdef ESP8266 +#define DISABLE_IRQ noInterrupts() +#define RESTORE_IRQ interrupts() +#else +#define DISABLE_IRQ \ + uint8_t sreg = SREG; \ + cli(); + +#define RESTORE_IRQ \ + SREG = sreg; +#endif + +template class CircularBuffer +{ + public: + /** Constructor + * @param buffer Preallocated buffer of at least size records. + * @param size Number of records available in the buffer. + */ + CircularBuffer(T* buffer, const uint8_t size ) + : m_size(size), m_buff(buffer) + { + clear(); + } + + /** Clear all entries in the circular buffer. */ + void clear(void) + { + m_front = 0; + m_fill = 0; + } + + /** Test if the circular buffer is empty */ + inline bool empty(void) const + { + return !m_fill; + } + + /** Return the number of records stored in the buffer */ + inline uint8_t available(void) const + { + return m_fill; + } + + /** Test if the circular buffer is full */ + inline bool full(void) const + { + return m_fill == m_size; + } + + /** Aquire record on front of the buffer, for writing. + * After filling the record, it has to be pushed to actually + * add it to the buffer. + * @return Pointer to record, or NULL when buffer is full. + */ + T* getFront(void) const + { + DISABLE_IRQ; + T* f = NULL; + if (!full()) + f = get(m_front); + RESTORE_IRQ; + return f; + } + + /** Push record to front of the buffer + * @param record Record to push. If record was aquired previously (using getFront) its + * data will not be copied as it is already present in the buffer. + * @return True, when record was pushed successfully. + */ + bool pushFront(T* record) + { + bool ok = false; + DISABLE_IRQ; + if (!full()) + { + T* f = get(m_front); + if (f != record) + *f = *record; + m_front = (m_front+1) % m_size; + m_fill++; + ok = true; + } + RESTORE_IRQ; + return ok; + } + + /** Aquire record on back of the buffer, for reading. + * After reading the record, it has to be pop'ed to actually + * remove it from the buffer. + * @return Pointer to record, or NULL when buffer is empty. + */ + T* getBack(void) const + { + T* b = NULL; + DISABLE_IRQ; + if (!empty()) + b = get(back()); + RESTORE_IRQ; + return b; + } + + /** Remove record from back of the buffer. + * @return True, when record was pop'ed successfully. + */ + bool popBack(void) + { + bool ok = false; + DISABLE_IRQ; + if (!empty()) + { + m_fill--; + ok = true; + } + RESTORE_IRQ; + return ok; + } + + protected: + inline T * get(const uint8_t idx) const + { + return &(m_buff[idx]); + } + inline uint8_t back(void) const + { + return (m_front - m_fill + m_size) % m_size; + } + + const uint8_t m_size; // Total number of records that can be stored in the buffer. + T* const m_buff; // Ptr to buffer holding all records. + volatile uint8_t m_front; // Index of front element (not pushed yet). + volatile uint8_t m_fill; // Amount of records currently pushed. +}; + +#endif // CircularBuffer_h diff --git a/tools/HoyDtuSim/Debug.h b/tools/HoyDtuSim/Debug.h new file mode 100644 index 00000000..3b2807d6 --- /dev/null +++ b/tools/HoyDtuSim/Debug.h @@ -0,0 +1,23 @@ +#ifndef __DEBUG_H + +#define __DEBUG_H + +#ifdef DEBUG + #define DEBUG_OUT Serial +#else +//--- +// disable Serial DEBUG output + #define DEBUG_OUT DummySerial + static class { + public: + void begin(...) {} + void print(...) {} + void println(...) {} + void flush() {} + bool available() { return false;} + int readBytes(...) { return 0;} + int printf (...) {return 0;} + } DummySerial; +#endif + +#endif diff --git a/tools/HoyDtuSim/HM1200.h b/tools/HoyDtuSim/HM1200.h new file mode 100644 index 00000000..c8c27d87 --- /dev/null +++ b/tools/HoyDtuSim/HM1200.h @@ -0,0 +1,38 @@ +#ifndef __HM1200_H +#define __HM1200_H + +#define HM1200 + +const measureDef_t hm1200_measureDef[] = { + { IDX_UDC, UNIT_V, CH1, CMD01, 14, BYTES2, DIV10 }, + { IDX_IDC, UNIT_A, CH1, CMD01, 16, BYTES2, DIV100 }, + { IDX_PDC, UNIT_W, CH1, CMD01, 20, BYTES2, DIV10 }, + { IDX_E_TAG, UNIT_WH, CH1, CMD02, 16, BYTES2, DIV1 }, + { IDX_E_TOTAL, UNIT_KWH, CH1, CMD01, 24, BYTES4, DIV1000 }, + { IDX_UDC, UNIT_V, CH2, CMD02, 20, BYTES2, DIV10 }, + { IDX_IDC, UNIT_A, CH2, CMD01, 18, BYTES2, DIV100 }, + { IDX_PDC, UNIT_W, CH2, CMD01, 22, BYTES2, DIV10 }, + { IDX_E_TAG, UNIT_WH, CH2, CMD02, 18, BYTES2, DIV1 }, + { IDX_E_TOTAL, UNIT_KWH, CH2, CMD02, 12, BYTES4, DIV1000 }, + { IDX_IDC, UNIT_A, CH3, CMD02, 22, BYTES2, DIV100 }, + { IDX_PDC, UNIT_W, CH3, CMD02, 26, BYTES2, DIV10 }, + { IDX_E_TAG, UNIT_WH, CH3, CMD03, 22, BYTES2, DIV1 }, + { IDX_E_TOTAL, UNIT_KWH, CH3, CMD03, 14, BYTES4, DIV1000 }, + { IDX_IDC, UNIT_A, CH4, CMD02, 24, BYTES2, DIV100 }, + { IDX_PDC, UNIT_W, CH4, CMD03, 12, BYTES2, DIV10 }, + { IDX_E_TAG, UNIT_WH, CH4, CMD03, 24, BYTES2, DIV1 }, + { IDX_E_TOTAL, UNIT_KWH, CH4, CMD03, 18, BYTES4, DIV1000 }, + { IDX_UAC, UNIT_V, CH0, CMD03, 26, BYTES2, DIV10 }, + { IDX_IPV, UNIT_A, CH0, CMD84, 18, BYTES2, DIV100 }, + { IDX_PAC, UNIT_W, CH0, CMD84, 14, BYTES2, DIV10 }, + { IDX_FREQ, UNIT_HZ, CH0, CMD84, 12, BYTES2, DIV100 }, + { IDX_PERCNT, UNIT_PCT, CH0, CMD84, 20, BYTES2, DIV10 }, + { IDX_WR_TEMP, UNIT_C, CH0, CMD84, 22, BYTES2, DIV10 } +}; + +measureCalc_t hm1200_measureCalc[] = {}; + +#define HM1200_MEASURE_LIST_LEN sizeof(hm1200_measureDef)/sizeof(measureDef_t) +#define HM1200_CALCED_LIST_LEN 0 + +#endif diff --git a/tools/HoyDtuSim/HM600.h b/tools/HoyDtuSim/HM600.h new file mode 100644 index 00000000..9ba5c1a8 --- /dev/null +++ b/tools/HoyDtuSim/HM600.h @@ -0,0 +1,37 @@ +#ifndef __HM600_H +#define __HM600_H + +#define HM600 +#define HM700 + + +float calcEheute (float *measure) { return measure[8] + measure[9]; } +float calcIpv (float *measure) { return (measure[10] != 0 ? measure[12]/measure[10] : 0); } + +const measureDef_t hm600_measureDef[] = { + { IDX_UDC, CH1, UNIT_V, CMD01, 14, BYTES2, DIV10}, + { IDX_IDC, CH1, UNIT_A, CMD01, 16, BYTES2, DIV100}, + { IDX_PDC, CH1, UNIT_W, CMD01, 18, BYTES2, DIV10}, + { IDX_UDC, CH2, UNIT_V, CMD01, 20, BYTES2, DIV10}, + { IDX_IDC, CH2, UNIT_A, CMD01, 22, BYTES2, DIV100}, + { IDX_PDC, CH2, UNIT_W, CMD01, 24, BYTES2, DIV10}, + { IDX_E_WOCHE,CH0, UNIT_WH, CMD02, 12, BYTES2, DIV1}, + { IDX_E_TOTAL,CH0, UNIT_WH, CMD02, 14, BYTES4, DIV1}, + { IDX_E_TAG, CH1, UNIT_WH, CMD02, 18, BYTES2, DIV1}, + { IDX_E_TAG, CH2, UNIT_WH, CMD02, 20, BYTES2, DIV1}, + { IDX_UAC, CH0, UNIT_V, CMD02, 22, BYTES2, DIV10}, + { IDX_FREQ, CH0, UNIT_HZ, CMD02, 24, BYTES2, DIV100}, + { IDX_PAC, CH0, UNIT_W, CMD02, 26, BYTES2, DIV10}, + { IDX_WR_TEMP,CH0, UNIT_C, CMD83, 18, BYTES2, DIV10} +}; + + +measureCalc_t hm600_measureCalc[] = { + { IDX_E_HEUTE, UNIT_WH, DIV1, &calcEheute}, + { IDX_IPV, UNIT_A, DIV100, &calcIpv} +}; + +#define HM600_MEASURE_LIST_LEN sizeof(hm600_measureDef)/sizeof(measureDef_t) +#define HM600_CALCED_LIST_LEN sizeof(hm600_measureCalc)/sizeof(measureCalc_t) + +#endif diff --git a/tools/HoyDtuSim/HoyDtuSim.ino b/tools/HoyDtuSim/HoyDtuSim.ino new file mode 100644 index 00000000..87423e49 --- /dev/null +++ b/tools/HoyDtuSim/HoyDtuSim.ino @@ -0,0 +1,605 @@ +#include +#include +#include "CircularBuffer.h" +#include +#include "printf.h" +#include +#include "hm_crc.h" +#include "hm_packets.h" + +#include "Settings.h" // Header für Einstellungen +#include "Debug.h" +#include "Inverters.h" + +const char VERSION[] PROGMEM = "0.1.6"; + + +#ifdef ESP8266 + #define DISABLE_EINT noInterrupts() + #define ENABLE_EINT interrupts() +#else // für AVR z.B. ProMini oder Nano + #define DISABLE_EINT EIMSK = 0x00 + #define ENABLE_EINT EIMSK = 0x01 +#endif + + +#ifdef ESP8266 +#define PACKET_BUFFER_SIZE (30) +#else +#define PACKET_BUFFER_SIZE (20) +#endif + +// Startup defaults until user reconfigures it +//#define DEFAULT_RECV_CHANNEL (3) // 3 = Default channel for Hoymiles +//#define DEFAULT_SEND_CHANNEL (75) // 40 = Default channel for Hoymiles, 61 + +static HM_Packets hmPackets; +static uint32_t tickMillis; + +// Set up nRF24L01 radio on SPI bus plus CE/CS pins +// If more than one RF24 unit is used the another CS pin than 10 must be used +// This pin is used hard coded in SPI library +static RF24 Radio (RF1_CE_PIN, RF1_CS_PIN); + +static NRF24_packet_t bufferData[PACKET_BUFFER_SIZE]; + +static CircularBuffer packetBuffer(bufferData, sizeof(bufferData) / sizeof(bufferData[0])); + +static Serial_header_t SerialHdr; + +#define CHECKCRC 1 +static uint16_t lastCRC; +static uint16_t crc; + +uint8_t channels[] = {3, 23, 40, 61, 75}; //{1, 3, 6, 9, 11, 23, 40, 61, 75} +uint8_t channelIdx = 2; // fange mit 40 an +uint8_t DEFAULT_SEND_CHANNEL = channels[channelIdx]; // = 40 + +#if USE_POOR_MAN_CHANNEL_HOPPING_RCV +uint8_t rcvChannelIdx = 0; +uint8_t rcvChannels[] = {3, 23, 40, 61, 75}; //{1, 3, 6, 9, 11, 23, 40, 61, 75} +uint8_t DEFAULT_RECV_CHANNEL = rcvChannels[rcvChannelIdx]; //3; +uint8_t intvl = 4; // Zeit für poor man hopping +int hophop; +#else +uint8_t DEFAULT_RECV_CHANNEL = 3; +#endif + +boolean valueChanged = false; + +static unsigned long timeLastPacket = millis(); +static unsigned long timeLastIstTagCheck = millis(); +static unsigned long timeLastRcvChannelSwitch = millis(); + +// Function forward declaration +static void SendPacket(uint64_t dest, uint8_t *buf, uint8_t len); + + +static const char BLANK = ' '; + +static boolean istTag = true; + +char CHANNELNAME_BUFFER[15]; + +#ifdef ESP8266 + #include "wifi.h" + #include "ModWebserver.h" + #include "Sonne.h" +#endif + + +inline static void dumpData(uint8_t *p, int len) { +//----------------------------------------------- + while (len > 0){ + if (*p < 16) + DEBUG_OUT.print(F("0")); + DEBUG_OUT.print(*p++, HEX); + len--; + } + DEBUG_OUT.print(BLANK); +} + + +float extractValue2 (uint8_t *p, int divisor) { +//------------------------------------------- + uint16_t b1 = *p++; + return ((float) (b1 << 8) + *p) / (float) divisor; +} + + +float extractValue4 (uint8_t *p, int divisor) { +//------------------------------------------- + uint32_t ret = *p++; + for (uint8_t i = 1; i <= 3; i++) + ret = (ret << 8) + *p++; + return (ret / divisor); +} + +void outChannel (uint8_t wr, uint8_t i) { +//------------------------------------ + DEBUG_OUT.print(getMeasureName(wr, i)); + DEBUG_OUT.print(F("\t:")); + DEBUG_OUT.print(getMeasureValue(wr,i)); + DEBUG_OUT.println(BLANK); +} + + +void analyseWords (uint8_t *p) { // p zeigt auf 01 hinter 2. WR-Adr +//---------------------------------- + //uint16_t val; + DEBUG_OUT.print (F("analyse words:")); + p++; + for (int i = 0; i <12;i++) { + DEBUG_OUT.print(extractValue2(p,1)); + DEBUG_OUT.print(BLANK); + p++; + } + DEBUG_OUT.println(); +} + +void analyseLongs (uint8_t *p) { // p zeigt auf 01 hinter 2. WR-Adr +//---------------------------------- + //uint16_t val; + DEBUG_OUT.print (F("analyse longs:")); + p++; + for (int i = 0; i <12;i++) { + DEBUG_OUT.print(extractValue4(p,1)); + DEBUG_OUT.print(BLANK); + p++; + } + DEBUG_OUT.println(); +} + + +void analyse (NRF24_packet_t *p) { +//------------------------------ + uint8_t wrIdx = findInverter (&p->packet[3]); + //DEBUG_OUT.print ("wrIdx="); DEBUG_OUT.println (wrIdx); + if (wrIdx == 0xFF) return; + uint8_t cmd = p->packet[11]; + float val = 0; + if (cmd == 0x01 || cmd == 0x02 || cmd == 0x83) { + const measureDef_t *defs = inverters[wrIdx].measureDef; + + for (uint8_t i = 0; i < inverters[wrIdx].anzMeasures; i++) { + if (defs[i].teleId == cmd) { + uint8_t pos = defs[i].pos; + if (defs[i].bytes == 2) + val = extractValue2 (&p->packet[pos], getDivisor(wrIdx, i) ); + else if (defs[i].bytes == 4) + val = extractValue4 (&p->packet[pos], getDivisor(wrIdx, i) ); + valueChanged = valueChanged ||(val != inverters[wrIdx].values[i]); + inverters[wrIdx].values[i] = val; + } + } + // calculated funstions + for (uint8_t i = 0; i < inverters[wrIdx].anzMeasureCalculated; i++) { + val = inverters[wrIdx].measureCalculated[i].f (inverters[wrIdx].values); + int idx = inverters[wrIdx].anzMeasures + i; + valueChanged = valueChanged ||(val != inverters[wrIdx].values[idx]); + inverters[wrIdx].values[idx] = val; + } + } + else if (cmd == 0x81) { + ; + } + else { + DEBUG_OUT.print (F("---- neues cmd=")); DEBUG_OUT.println(cmd, HEX); + analyseWords (&p->packet[11]); + analyseLongs (&p->packet[11]); + DEBUG_OUT.println(); + } + if (p->packetsLost > 0) { + DEBUG_OUT.print(F(" Lost: ")); + DEBUG_OUT.println(p->packetsLost); + } +} + +#ifdef ESP8266 +IRAM_ATTR +#endif +void handleNrf1Irq() { +//------------------------- + static uint8_t lostPacketCount = 0; + uint8_t pipe; + + DISABLE_EINT; + + // Loop until RX buffer(s) contain no more packets. + while (Radio.available(&pipe)) { + if (!packetBuffer.full()) { + NRF24_packet_t *p = packetBuffer.getFront(); + p->timestamp = micros(); // Micros does not increase in interrupt, but it can be used. + p->packetsLost = lostPacketCount; + p->rcvChannel = DEFAULT_RECV_CHANNEL; + uint8_t packetLen = Radio.getPayloadSize(); + if (packetLen > MAX_RF_PAYLOAD_SIZE) + packetLen = MAX_RF_PAYLOAD_SIZE; + + Radio.read(p->packet, packetLen); + packetBuffer.pushFront(p); + lostPacketCount = 0; + } + else { + // Buffer full. Increase lost packet counter. + bool tx_ok, tx_fail, rx_ready; + if (lostPacketCount < 255) + lostPacketCount++; + // Call 'whatHappened' to reset interrupt status. + Radio.whatHappened(tx_ok, tx_fail, rx_ready); + // Flush buffer to drop the packet. + Radio.flush_rx(); + } + } + ENABLE_EINT; +} + + +static void activateConf(void) { +//----------------------------- + Radio.begin(); + // Disable shockburst for receiving and decode payload manually + Radio.setAutoAck(false); + Radio.setRetries(0, 0); + Radio.setChannel(DEFAULT_RECV_CHANNEL); + Radio.setDataRate(DEFAULT_RF_DATARATE); + Radio.disableCRC(); + Radio.setAutoAck(0x00); + Radio.setPayloadSize(MAX_RF_PAYLOAD_SIZE); + Radio.setAddressWidth(5); + Radio.openReadingPipe(1, DTU_RADIO_ID); + + // We want only RX irqs + Radio.maskIRQ(true, true, false); + + // Use lo PA level, as a higher level will disturb CH340 DEBUG_OUT usb adapter + Radio.setPALevel(RF24_PA_MAX); + Radio.startListening(); + + // Attach interrupt handler to NRF IRQ output. Overwrites any earlier handler. + attachInterrupt(digitalPinToInterrupt(RF1_IRQ_PIN), handleNrf1Irq, FALLING); // NRF24 Irq pin is active low. + + // Initialize SerialHdr header's address member to promiscuous address. + uint64_t addr = DTU_RADIO_ID; + for (int8_t i = sizeof(SerialHdr.address) - 1; i >= 0; --i) { + SerialHdr.address[i] = addr; + addr >>= 8; + } + + //Radio.printDetails(); + //DEBUG_OUT.println(); + tickMillis = millis() + 200; +} + +#define resetRF24() activateConf() + + +void setup(void) { +//-------------- + #ifndef DEBUG + #ifndef ESP8266 + Serial.begin(SER_BAUDRATE); + #endif + #endif + printf_begin(); + DEBUG_OUT.begin(SER_BAUDRATE); + DEBUG_OUT.flush(); + + DEBUG_OUT.println(F("-- Hoymiles DTU Simulation --")); + + // Configure nRF IRQ input + pinMode(RF1_IRQ_PIN, INPUT); + + activateConf(); + +#ifdef ESP8266 + setupWifi(); + setupClock(); + setupWebServer(); + setupUpdateByOTA(); + calcSunUpDown (getNow()); + istTag = isDayTime(); + DEBUG_OUT.print (F("Es ist ")); DEBUG_OUT.println (istTag?F("Tag"):F("Nacht")); + hmPackets.SetUnixTimeStamp (getNow()); +#else + hmPackets.SetUnixTimeStamp(0x62456430); +#endif + + setupInverts(); +} + + uint8_t sendBuf[MAX_RF_PAYLOAD_SIZE]; + +void isTime2Send () { +//----------------- + // Second timer + static const uint8_t warteZeit = 1; + static uint8_t tickSec = 0; + if (millis() >= tickMillis) { + static uint8_t tel = 0; + tickMillis += warteZeit*1000; //200; + tickSec++; + + if (++tickSec >= 1) { // 5 + for (uint8_t c=0; c < warteZeit; c++) hmPackets.UnixTimeStampTick(); + tickSec = 0; + } + + int32_t size = 0; + uint64_t dest = 0; + for (uint8_t wr = 0; wr < anzInv; wr++) { + dest = inverters[wr].RadioId; + + if (tel > 1) + tel = 0; + + if (tel == 0) { + #ifdef ESP8266 + hmPackets.SetUnixTimeStamp (getNow()); + #endif + size = hmPackets.GetTimePacket((uint8_t *)&sendBuf, dest >> 8, DTU_RADIO_ID >> 8); + //DEBUG_OUT.print ("Timepacket mit cid="); DEBUG_OUT.println(sendBuf[10], HEX); + } + else if (tel <= 1) + size = hmPackets.GetCmdPacket((uint8_t *)&sendBuf, dest >> 8, DTU_RADIO_ID >> 8, 0x15, 0x80 + tel - 1); + + SendPacket (dest, (uint8_t *)&sendBuf, size); + } // for wr + + tel++; + +/* for (uint8_t warte = 0; warte < 2; warte++) { + delay(1000); + hmPackets.UnixTimeStampTick(); + }*/ + } +} + + +void outputPacket(NRF24_packet_t *p, uint8_t payloadLen) { +//----------------------------------------------------- + + // Write timestamp, packets lost, address and payload length + //printf(" %09lu ", SerialHdr.timestamp); + char _buf[20]; + sprintf_P(_buf, PSTR("rcv CH:%d "), p->rcvChannel); + DEBUG_OUT.print (_buf); + dumpData((uint8_t *)&SerialHdr.packetsLost, sizeof(SerialHdr.packetsLost)); + dumpData((uint8_t *)&SerialHdr.address, sizeof(SerialHdr.address)); + + // Trailing bit?!? + dumpData(&p->packet[0], 2); + + // Payload length from PCF + dumpData(&payloadLen, sizeof(payloadLen)); + + // Packet control field - PID Packet identification + uint8_t val = (p->packet[1] >> 1) & 0x03; + DEBUG_OUT.print(val); + DEBUG_OUT.print(F(" ")); + + if (payloadLen > 9) { + dumpData(&p->packet[2], 1); + dumpData(&p->packet[3], 4); + dumpData(&p->packet[7], 4); + + uint16_t remain = payloadLen - 2 - 1 - 4 - 4 + 4; + + if (remain < 32) { + dumpData(&p->packet[11], remain); + printf_P(PSTR("%04X "), crc); + + if (((crc >> 8) != p->packet[payloadLen + 2]) || ((crc & 0xFF) != p->packet[payloadLen + 3])) + DEBUG_OUT.print(0); + else + DEBUG_OUT.print(1); + } + else { + DEBUG_OUT.print(F("Ill remain ")); + DEBUG_OUT.print(remain); + } + } + else { + dumpData(&p->packet[2], payloadLen + 2); + printf_P(PSTR("%04X "), crc); + } + DEBUG_OUT.println(); + DEBUG_OUT.flush(); +} + +void writeArduinoInterface() { +//-------------------------- + if (valueChanged) { + for (uint8_t wr = 0; wr < anzInv; wr++) { + if (anzInv > 1) { + Serial.print(wr); Serial.print('.'); + } + for (uint8_t i = 0; i < inverters[wr].anzTotalMeasures; i++) { + Serial.print(getMeasureName(wr,i)); // Schnittstelle bei Arduino + Serial.print('='); + Serial.print(getMeasureValue(wr,i), getDigits(wr,i)); // Schnittstelle bei Arduino + Serial.print (BLANK); + Serial.println (getUnit(wr, i)); + } // for i + + } // for wr + Serial.println(F("-----------------------")); + valueChanged = false; + } +} + +boolean doCheckCrc (NRF24_packet_t *p, uint8_t payloadLen) { +//-------------------------------------------------------- + crc = 0xFFFF; + crc = crc16((uint8_t *)&SerialHdr.address, sizeof(SerialHdr.address), crc, 0, BYTES_TO_BITS(sizeof(SerialHdr.address))); + // Payload length + // Add one byte and one bit for 9-bit packet control field + crc = crc16((uint8_t *)&p->packet[0], sizeof(p->packet), crc, 7, BYTES_TO_BITS(payloadLen + 1) + 1); + + if (CHECKCRC) { + // If CRC is invalid only show lost packets + if (((crc >> 8) != p->packet[payloadLen + 2]) || ((crc & 0xFF) != p->packet[payloadLen + 3])) { + if (p->packetsLost > 0) { + DEBUG_OUT.print(F(" Lost: ")); + DEBUG_OUT.println(p->packetsLost); + } + packetBuffer.popBack(); + return false; + } + + // Dump a decoded packet only once + if (lastCRC == crc) { + packetBuffer.popBack(); + return false; + } + lastCRC = crc; + } + + // Don't dump mysterious ack packages + if (payloadLen == 0) { + packetBuffer.popBack(); + return false; + } + return true; +} + +void poorManChannelHopping() { +//-------------------------- + if (hophop <= 0) return; + if (millis() >= timeLastRcvChannelSwitch + intvl) { + rcvChannelIdx++; + if (rcvChannelIdx >= sizeof(rcvChannels)) + rcvChannelIdx = 0; + DEFAULT_RECV_CHANNEL = rcvChannels[rcvChannelIdx]; + DISABLE_EINT; + Radio.stopListening(); + Radio.setChannel (DEFAULT_RECV_CHANNEL); + Radio.startListening(); + ENABLE_EINT; + timeLastRcvChannelSwitch = millis(); + hophop--; + } + +} +void loop(void) { +//============= + // poor man channel hopping on receive +#if USE_POOR_MAN_CHANNEL_HOPPING_RCV + poorManChannelHopping(); +#endif + + if (millis() > timeLastPacket + 50000UL) { + DEBUG_OUT.println (F("Reset RF24")); + resetRF24(); + timeLastPacket = millis(); + } + + while (!packetBuffer.empty()) { + timeLastPacket = millis(); + // One or more records present + NRF24_packet_t *p = packetBuffer.getBack(); + + // Shift payload data due to 9-bit packet control field + for (int16_t j = sizeof(p->packet) - 1; j >= 0; j--) { + if (j > 0) + p->packet[j] = (byte)(p->packet[j] >> 7) | (byte)(p->packet[j - 1] << 1); + else + p->packet[j] = (byte)(p->packet[j] >> 7); + } + + SerialHdr.timestamp = p->timestamp; + SerialHdr.packetsLost = p->packetsLost; + + uint8_t payloadLen = ((p->packet[0] & 0x01) << 5) | (p->packet[1] >> 3); + // Check CRC + if (! doCheckCrc(p, payloadLen) ) + continue; + + #ifdef DEBUG + uint8_t cmd = p->packet[11]; + //if (cmd != 0x01 && cmd != 0x02 && cmd != 0x83 && cmd != 0x81) + outputPacket (p, payloadLen); + #endif + + analyse (p); + + #ifndef ESP8266 + writeArduinoInterface(); + #endif + + // Remove record as we're done with it. + packetBuffer.popBack(); + } + + if (istTag) + isTime2Send(); + + #ifdef ESP8266 + checkWifi(); + webserverHandle(); + checkUpdateByOTA(); + if (hour() == 0 && minute() == 0) { + calcSunUpDown(getNow()); + delay (60*1000); + } + + if (millis() > timeLastIstTagCheck + 15UL * 60UL * 1000UL) { // alle 15 Minuten neu berechnen ob noch hell + istTag = isDayTime(); + DEBUG_OUT.print (F("Es ist ")); DEBUG_OUT.println (istTag?F("Tag"):F("Nacht")); + timeLastIstTagCheck = millis(); + } + #endif +/* + if (millis() > timeLastPacket + 60UL*SECOND) { // 60 Sekunden + channelIdx++; + if (channelIdx >= sizeof(channels)) channelIdx = 0; + DEFAULT_SEND_CHANNEL = channels[channelIdx]; + DEBUG_OUT.print (F("\nneuer DEFAULT_SEND_CHANNEL: ")); DEBUG_OUT.println(DEFAULT_SEND_CHANNEL); + timeLastPacket = millis(); + } +*/ +} + + +static void SendPacket(uint64_t dest, uint8_t *buf, uint8_t len) { +//-------------------------------------------------------------- + //DEBUG_OUT.print (F("Sende: ")); DEBUG_OUT.println (buf[9], HEX); + //dumpData (buf, len); DEBUG_OUT.println(); + DISABLE_EINT; + Radio.stopListening(); + +#ifdef CHANNEL_HOP + static uint8_t hop = 0; + #if DEBUG_SEND + DEBUG_OUT.print(F("Send... CH")); + DEBUG_OUT.println(channels[hop]); + #endif + Radio.setChannel(channels[hop++]); + if (hop >= sizeof(channels) / sizeof(channels[0])) + hop = 0; +#else + Radio.setChannel(DEFAULT_SEND_CHANNEL); +#endif + + Radio.openWritingPipe(dest); + Radio.setCRCLength(RF24_CRC_16); + Radio.enableDynamicPayloads(); + Radio.setAutoAck(true); + Radio.setRetries(3, 15); + + bool res = Radio.write(buf, len); + // Try to avoid zero payload acks (has no effect) + Radio.openWritingPipe(DUMMY_RADIO_ID); + + Radio.setAutoAck(false); + Radio.setRetries(0, 0); + Radio.disableDynamicPayloads(); + Radio.setCRCLength(RF24_CRC_DISABLED); + + Radio.setChannel(DEFAULT_RECV_CHANNEL); + Radio.startListening(); + ENABLE_EINT; +#if USE_POOR_MAN_CHANNEL_HOPPING_RCV + hophop = 5 * sizeof(rcvChannels); +#endif +} diff --git a/tools/HoyDtuSim/Inverters.h b/tools/HoyDtuSim/Inverters.h new file mode 100644 index 00000000..af929af2 --- /dev/null +++ b/tools/HoyDtuSim/Inverters.h @@ -0,0 +1,283 @@ +#ifndef __INVERTERS_H +#define __INVERTERS_H + +// Ausgabe von Debug Infos auf der seriellen Console + +#include "Settings.h" +#include "Debug.h" + + +typedef struct _NRF24_packet_t { + uint32_t timestamp; + uint8_t packetsLost; + uint8_t rcvChannel; + uint8_t packet[MAX_RF_PAYLOAD_SIZE]; +} NRF24_packet_t; + + +typedef struct _Serial_header_t { + unsigned long timestamp; + uint8_t packetsLost; + uint8_t address[RF_MAX_ADDR_WIDTH]; // MSB first, always RF_MAX_ADDR_WIDTH bytes. +} Serial_header_t; + + +// structs für Inverter und Kanalwerte + +// Liste der Einheiten +enum UNITS {UNIT_V = 0, UNIT_HZ, UNIT_A, UNIT_W, UNIT_WH, UNIT_C, UNIT_KWH, UNIT_MA, UNIT_PCT}; +const char* const units[] = {"V", "Hz", "A", "W", "Wh", "°C", "KWh", "mA", "%"}; + +// CH0 is default channel (freq, ac, temp) +enum CHANNELS {CH0 = 0, CH1, CH2, CH3, CH4}; +enum CMDS {CMD01 = 0x01, CMD02, CMD03, CMD83 = 0x83, CMD84}; +enum DIVS {DIV1 = 0, DIV10, DIV100, DIV1000}; + +#define BYTES2 2 +#define BYTES4 4 + +const char UDC[] PROGMEM = "Udc"; +const char IDC[] PROGMEM = "Idc"; +const char PDC[] PROGMEM = "Pdc"; +const char E_WOCHE[] PROGMEM = "E-Woche"; +const char E_TOTAL[] PROGMEM = "E-Total"; +const char E_TAG[] PROGMEM = "E-Tag"; +const char UAC[] PROGMEM = "Uac"; +const char FREQ[] PROGMEM = "Freq.ac"; +const char PAC[] PROGMEM = "Pac"; +const char E_HEUTE[] PROGMEM = "E-heute"; +const char IPV[] PROGMEM = "Ipv"; +const char WR_TEMP[] PROGMEM = "WR-Temp"; +const char PERCNT[] PROGMEM = "Pct"; + +#define IDX_UDC 0 +#define IDX_IDC 1 +#define IDX_PDC 2 +#define IDX_E_WOCHE 3 +#define IDX_E_TOTAL 4 +#define IDX_E_TAG 5 +#define IDX_UAC 6 +#define IDX_FREQ 7 +#define IDX_PAC 8 +#define IDX_E_HEUTE 9 +#define IDX_IPV 10 +#define IDX_WR_TEMP 11 +#define IDX_PERCNT 12 + +const char* const NAMES[] + = {UDC, IDC, PDC, E_WOCHE, E_TOTAL, E_TAG, UAC, FREQ, PAC, E_HEUTE, IPV, WR_TEMP, PERCNT}; + +typedef float (*calcValueFunc)(float *); + +struct measureDef_t { + uint8_t nameIdx; //const char* name; // Zeiger auf den Messwertnamen + uint8_t channel; // 0..4, + uint8_t unitIdx; // Index in die Liste der Einheiten 'units' + uint8_t teleId; // Telegramm ID, das was hinter der 2. WR Nummer im Telegramm, 02, 03, 83 + uint8_t pos; // ab dieser POsition beginnt der Wert (Big Endian) + uint8_t bytes; // Anzahl der Bytes + uint8_t digits; +}; + +struct measureCalc_t { + uint8_t nameIdx; //const char* name; // Zeiger auf den Messwertnamen + uint8_t unitIdx; // Index in die Liste der Einheiten 'units' + uint8_t digits; + calcValueFunc f; // die Funktion zur Berechnung von Werten, zb Summe von Werten +}; + + +struct inverter_t { + uint8_t ID; // Inverter-ID = Index + char name[20]; // Name des Inverters zb HM-600.1 + uint64_t serialNo; // dier Seriennummer wie im Barcode auf dem WR, also 1141..... + uint64_t RadioId; // die gespiegelte (letzte 4 "Bytes") der Seriennummer + const measureDef_t *measureDef; // aus Include HMxxx.h : Liste mit Definitionen der Messwerte, wie Telgramm, offset, länge, ... + uint8_t anzMeasures; // Länge der Liste + measureCalc_t *measureCalculated; // Liste mit Defintion für berechnete Werte + uint8_t anzMeasureCalculated; // Länge der Liste + uint8_t anzTotalMeasures; // Gesamtanzahl Messwerte + float values[MAX_MEASURE_PER_INV]; // DIE Messewerte +}; + + +char _buffer[20]; + +uint8_t anzInv = 0; +inverter_t inverters[MAX_ANZ_INV]; + +union longlongasbytes { + uint64_t ull; + uint32_t ul[2]; + uint8_t bytes[8]; +}; + +char *uint64toa (uint64_t s) { +//-------------------------------- +//0x1141 72607952ULL + sprintf(_buffer, "%lX%08lX", (unsigned long)(s>>32), (unsigned long)(s&0xFFFFFFFFULL)); + return _buffer; +} + + +uint64_t Serial2RadioID (uint64_t sn) { +//---------------------------------- + longlongasbytes llsn; + longlongasbytes res; + llsn.ull = sn; + res.ull = 0; + res.bytes[4] = llsn.bytes[0]; + res.bytes[3] = llsn.bytes[1]; + res.bytes[2] = llsn.bytes[2]; + res.bytes[1] = llsn.bytes[3]; + res.bytes[0] = 0x01; + return res.ull; +} + + +void addInverter (uint8_t _ID, const char * _name, uint64_t _serial, + const measureDef_t * liste, int anzMeasure, + measureCalc_t * calcs, int anzMeasureCalculated) { +//------------------------------------------------------------------------------------- + if (anzInv >= MAX_ANZ_INV) { + DEBUG_OUT.println(F("ANZ_INV zu klein!")); + return; + } + inverter_t *p = &(inverters[anzInv]); + p->ID = _ID; + strcpy (p->name, _name); + p->serialNo = _serial; + p->RadioId = Serial2RadioID(_serial); + p->measureDef = liste; + p->anzMeasures = anzMeasure; + p->anzMeasureCalculated = anzMeasureCalculated; + p->measureCalculated = calcs; + p->anzTotalMeasures = anzMeasure + anzMeasureCalculated; + memset (p->values, 0, sizeof(p->values)); + + DEBUG_OUT.print (F("WR : ")); DEBUG_OUT.println(anzInv); + DEBUG_OUT.print (F("Type : ")); DEBUG_OUT.println(_name); + DEBUG_OUT.print (F("Serial : ")); DEBUG_OUT.println(uint64toa(_serial)); + DEBUG_OUT.print (F("Radio-ID : ")); DEBUG_OUT.println(uint64toa(p->RadioId)); + + anzInv++; +} + + +static uint8_t toggle = 0; // nur für Test, ob's auch für mehere WR funzt +uint8_t findInverter (uint8_t *fourbytes) { +//--------------------------------------- + for (uint8_t i = 0; i < anzInv; i++) { + longlongasbytes llb; + llb.ull = inverters[i].serialNo; + if (llb.bytes[3] == fourbytes[0] && + llb.bytes[2] == fourbytes[1] && + llb.bytes[1] == fourbytes[2] && + llb.bytes[0] == fourbytes[3] ) + { + return i; + //if (toggle) toggle = 0; else toggle = 1; return toggle; // Test ob mehr WR auch geht + } + } + return 0xFF; // nicht gefunden +} + + +char * error = {"error"}; + +char *getMeasureName (uint8_t wr, uint8_t i){ +//------------------------------------------ + inverter_t *p = &(inverters[wr]); + if (i >= p->anzTotalMeasures) return error; + uint8_t idx, channel = 0; + if (i < p->anzMeasures) { + idx = p->measureDef[i].nameIdx; + channel = p->measureDef[i].channel; + } + else { + idx = p->measureCalculated[i - p->anzMeasures].nameIdx; + } + char tmp[20]; + strcpy_P (_buffer, NAMES[idx]); + if (channel) { + sprintf_P (tmp, PSTR(".CH%d"), channel); + strcat(_buffer,tmp); + } + return _buffer; +} + +const char *getUnit (uint8_t wr, uint8_t i) { +//------------------------------------------ + inverter_t *p = &(inverters[wr]); + if (i >= p->anzTotalMeasures) return error; + uint8_t idx; + if (i < p->anzMeasures) + idx = p->measureDef[i].unitIdx; + else + idx = p->measureCalculated[i-p->anzMeasures].unitIdx; + + //strcpy (_buffer, units[i]); + //return _buffer; + return units[idx]; +} + + +float getMeasureValue (uint8_t wr, uint8_t i) { +//------------------------------------------ + if (i >= inverters[wr].anzTotalMeasures) return 0.0; + return inverters[wr].values[i]; +} + + +int getDivisor (uint8_t wr, uint8_t i) { +//------------------------------------ + inverter_t *p = &(inverters[wr]); + if (i >= p->anzTotalMeasures) return 1; + if (i < p->anzMeasures) { + uint8_t digits = p->measureDef[i].digits; + if (digits == DIV1) return 1; + if (digits == DIV10) return 10; + if (digits == DIV100) return 100; + if (digits == DIV1000) return 1000; + return 1; + } + else + return p->measureCalculated[i].digits; +} + + +uint8_t getDigits (uint8_t wr, uint8_t i) { +//--------------------------------------- + inverter_t *p = &(inverters[wr]); + if (i >= p->anzTotalMeasures) return 0; + if (i < p->anzMeasures) + return p->measureDef[i].digits; + else + return p->measureCalculated[i-p->anzMeasures].digits; +} + +// +++++++++++++++++++++++++++++++++++ Inverter ++++++++++++++++++++++++++++++++++++++++++++++ + +#include "HM600.h" // für HM-600 und HM-700 + +#include "HM1200.h" + +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + +void setupInverts() { +//----------------- + + addInverter (0,"HM-600", 0x114172607952ULL, + hm600_measureDef, HM600_MEASURE_LIST_LEN, // Tabelle der Messwerte + hm600_measureCalc, HM600_CALCED_LIST_LEN); // Tabelle berechnete Werte + +/* + addInverter (1,"HM-1200", 0x114172607952ULL, + hm1200_measureDef, HM1200_MEASURE_LIST_LEN, // Tabelle der Messwerte + hm1200_measureCalc, HM1200_CALCED_LIST_LEN); // Tabelle berechnete Werte +*/ +} + + +#endif diff --git a/tools/HoyDtuSim/ModWebserver.h b/tools/HoyDtuSim/ModWebserver.h new file mode 100644 index 00000000..13c88df2 --- /dev/null +++ b/tools/HoyDtuSim/ModWebserver.h @@ -0,0 +1,151 @@ +// ################# WebServer ################# + +#ifndef __MODWEBSERVER_H +#define __MODWEBSERVER_H +#define MODWEBSERVER + +#include +#include "Debug.h" +#include "Settings.h" + +ESP8266WebServer server (WEBSERVER_PORT); + + +void returnOK () { + //-------------- + server.send(200, F("text/plain"), ""); +} + + +void returnFail(String msg) { + //------------------------- + server.send(500, F("text/plain"), msg + "\r\n"); +} + +void handleHelp () { +//----------------- + String out = ""; + out += "

Hilfe

"; + out += "

"; + out += ""; + out += ""; + out += ""; + out += ""; + out += "
/zeigt alle Messwerte in einer Tabelle; refresh alle 10 Sekunden
/datazum Abruf der Messwerte in der Form Name=wert
:{port+1}/updateOTA
/rebootstartet neu
"; + server.send (200, "text/html", out); +} + + +void handleReboot () { + //------------------- + returnOK (); + ESP.reset(); +} + + +void handleRoot() { + //---------------- + String out = ""; + out += ""; + out += "

Hoymiles Micro-Inverters

"; + char floatString[20]; + char line[100]; + for (uint8_t wr = 0; wr < anzInv; wr++) { + out += "

" + String(inverters[wr].name) + "

"; + out += "

S/N " + String (getSerialNoTxt(wr)) + "

"; + out += "

"; + out += ""; + for (uint8_t i = 0; i < inverters[wr].anzTotalMeasures; i++) { + dtostrf (getMeasureValue(wr, i),1, getDigits(wr,i), floatString); + sprintf(line, "", getMeasureName(wr, i), floatString, getUnit(wr, i)); + //DEBUG_OUT.println(line); + out += String(line); +/* out += ""; + out += ""; + out += ""; */ + } + out += "
KanalWertEinheit
%s%s%s
" + getMeasureName(i) + "" + String(getMeasureValue(i)) + "
" + String(getUnit(i)) + "
"; + } + int pos = out.indexOf("°"); + do { + if (pos>1) { + out = out.substring (0, pos) + "°" + out.substring(pos+2); + } + pos = out.indexOf("°"); + } while (pos>1); + + out += ""; + server.send (200, "text/html", out); + //DEBUG_OUT.println (out); +} + + +void handleData () { +//----------------- + String out = ""; + for (uint8_t wr = 0; wr < anzInv; wr++) { + for (int i = 0; i < inverters[wr].anzTotalMeasures; i++) { + out += (anzInv <= 1 ? "" : String (wr) + ".") + String(getMeasureName(wr,i)) + '=' + + String (getMeasureValue(wr,i)) /*+ ' ' + String(getUnit(wr,i))*/ + '\n'; + } + } + server.send(200, "text/plain", out); +} + + +void handleNotFound() { +//-------------------- + String message = "URI: "; + message += server.uri(); + message += "\nMethod: "; + message += (server.method() == HTTP_GET) ? "GET" : "POST"; + message += "\nArguments: "; + message += server.args(); + message += "\n"; + for (uint8_t i = 0; i < server.args(); i++) { + message += " NAME:" + server.argName(i) + "\n VALUE:" + server.arg(i) + "\n"; + } + server.send(404, "text/plain", message); +} + + +void setupWebServer (void) { + //------------------------- + server.begin(); + server.on("/", handleRoot); + server.on("/reboot", handleReboot); + server.on("/data", handleData); + server.on("/help", handleHelp); + //server.onNotFound(handleNotFound); wegen Spiffs-Dateimanager + + DEBUG_OUT.println ("[HTTP] installed"); +} + +void webserverHandle() { +//==================== + server.handleClient(); +} + + +// ################# OTA ################# + +#ifdef WITH_OTA +#include + +ESP8266WebServer httpUpdateServer (UPDATESERVER_PORT); +ESP8266HTTPUpdateServer httpUpdater; + +void setupUpdateByOTA () { + //------------------------ + httpUpdater.setup (&httpUpdateServer, UPDATESERVER_DIR, UPDATESERVER_USER, UPDATESERVER_PW); + httpUpdateServer.begin(); + DEBUG_OUT.println ("[OTA] installed"); +} + +void checkUpdateByOTA() { +//--------------------- + httpUpdateServer.handleClient(); +} +#endif + +#endif diff --git a/tools/HoyDtuSim/Settings.h b/tools/HoyDtuSim/Settings.h new file mode 100644 index 00000000..3e263fd5 --- /dev/null +++ b/tools/HoyDtuSim/Settings.h @@ -0,0 +1,69 @@ +#ifndef __SETTINGS_H +#define __SETTINGS_H + +// Ausgabe von Debug Infos auf der seriellen Console +#define DEBUG +#define SER_BAUDRATE (115200) + +#include "Debug.h" + +// Ausgabe was gesendet wird; 0 oder 1 +#define DEBUG_SEND 0 + +// soll zwichen den Sendekanälen 23, 40, 61, 75 ständig gewechselt werden +#define CHANNEL_HOP + +// mit OTA Support, also update der Firmware über WLan mittels IP/update +#define WITH_OTA + +// Hardware configuration +#ifdef ESP8266 +#define RF1_CE_PIN (D4) +#define RF1_CS_PIN (D8) +#define RF1_IRQ_PIN (D3) +#else +#define RF1_CE_PIN (9) +#define RF1_CS_PIN (10) +#define RF1_IRQ_PIN (2) +#endif + +// WR und DTU +#define RF_MAX_ADDR_WIDTH (5) +#define MAX_RF_PAYLOAD_SIZE (32) +#define DEFAULT_RF_DATARATE (RF24_250KBPS) // Datarate + +#define USE_POOR_MAN_CHANNEL_HOPPING_RCV 1 // 0 = not use + +#define DUMMY_RADIO_ID ((uint64_t)0xDEADBEEF01ULL) +#define DTU_RADIO_ID ((uint64_t)0x1234567801ULL) +#define MAX_ANZ_INV 2 // <<<<<<<<<<<<<<<<<<<<<<<< anpassen +#define MAX_MEASURE_PER_INV 25 // hier statisch, könnte auch dynamisch erzeugt werden, aber Overhead für dyn. Speicher? + +// Webserver +#define WEBSERVER_PORT 80 + +// Time Server +//#define TIMESERVER_NAME "pool.ntp.org" +#define TIMESERVER_NAME "fritz.box" // <<<<<<<<<<<<<<<<<<<<<<<< anpassen + +#ifdef WITH_OTA +// OTA Einstellungen +#define UPDATESERVER_PORT WEBSERVER_PORT+1 +#define UPDATESERVER_DIR "/update" +#define UPDATESERVER_USER "?????" // <<<<<<<<<<<<<<<<<<<<<<<< anpassen +#define UPDATESERVER_PW "?????" // <<<<<<<<<<<<<<<<<<<<<<<< anpassen +#endif + +// internes WLan +// PREFIXE dienen dazu, die eigenen WLans (wenn mehrere) von fremden zu unterscheiden +// gehe hier davon aus, dass alle WLans das gleiche Passwort haben. Wenn nicht, dann mehre Passwörter hinterlegen +#define SSID_PREFIX1 "pre1" // <<<<<<<<<<<<<<<<<<<<<<<< anpassen +#define SSID_PREFIX2 "pre2" // <<<<<<<<<<<<<<<<<<<<<<<< anpassen +#define SSID_PASSWORD "?????????????????" // <<<<<<<<<<<<<<<<<<<<<<<< anpassen + +// zur Berechnung von Sonnenauf- und -untergang +#define geoBreite 49.2866 // <<<<<<<<<<<<<<<<<<<<<<<< anpassen +#define geoLaenge 7.3416 // <<<<<<<<<<<<<<<<<<<<<<<< anpassen + + +#endif diff --git a/tools/HoyDtuSim/Sonne.h b/tools/HoyDtuSim/Sonne.h new file mode 100644 index 00000000..e80a8356 --- /dev/null +++ b/tools/HoyDtuSim/Sonne.h @@ -0,0 +1,55 @@ +#ifndef __SONNE_H +#define __SONNE_H + +#include "Settings.h" +#include "Debug.h" + + +long SunDown, SunUp; + +void calcSunUpDown (time_t date) { + //SunUpDown res = new SunUpDown(); + boolean isSummerTime = false; // TODO TimeZone.getDefault().inDaylightTime(new Date(date)); + + //- Bogenmass + double brad = geoBreite / 180.0 * PI; + // - Höhe Sonne -50 Bogenmin. + double h0 = -50.0 / 60.0 / 180.0 * PI; + //- Deklination dek, Tag des Jahres d0 + int tage = 30 * month(date) - 30 + day(date); + double dek = 0.40954 * sin (0.0172 * (tage - 79.35)); + double zh1 = sin (h0) - sin (brad) * sin(dek); + double zh2 = cos(brad) * cos(dek); + double zd = 12*acos (zh1/zh2) / PI; + double zgl = -0.1752 * sin (0.03343 * tage + 0.5474) - 0.134 * sin (0.018234 * tage - 0.1939); + //-Sonnenuntergang + double tsu = 12 + zd - zgl; + double su = (tsu + (15.0 - geoLaenge) / 15.0); + int std = (int)su; + int minute = (int) ((su - std)*60); + if (isSummerTime) std++; + SunDown = (100*std + minute) * 100; + + //- Sonnenaufgang + double tsa = 12 - zd - zgl; + double sa = (tsa + (15.0 - geoLaenge) /15.0); + std = (int) sa; + minute = (int) ((sa - std)*60); + if (isSummerTime) std++; + SunUp = (100*std + minute) * 100; + DEBUG_OUT.print(F("Sonnenaufgang :")); DEBUG_OUT.println(SunUp); + DEBUG_OUT.print(F("Sonnenuntergang:")); DEBUG_OUT.println(SunDown); +} + +boolean isDayTime() { +//----------------- +// 900 = 15 Minuten, vor Sonnenaufgang und nach -untergang + const int offset=60*15; + time_t no = getNow(); + long jetztMinuteU = (100 * hour(no+offset) + minute(no+offset)) * 100; + long jetztMinuteO = (100 * hour(no-offset) + minute(no-offset)) * 100; + + return ((jetztMinuteU >= SunUp) &&(jetztMinuteO <= SunDown)); +} + +#endif diff --git a/tools/HoyDtuSim/hm_crc.h b/tools/HoyDtuSim/hm_crc.h new file mode 100644 index 00000000..8a029619 --- /dev/null +++ b/tools/HoyDtuSim/hm_crc.h @@ -0,0 +1,102 @@ +#ifndef __HM_CRC_H +#define __HM_CRC_H + +#define BITS_TO_BYTES(x) (((x)+7)>>3) +#define BYTES_TO_BITS(x) ((x)<<3) + +extern uint16_t crc16_modbus(uint8_t *puchMsg, uint16_t usDataLen); +extern uint8_t crc8(uint8_t *buf, const uint16_t bufLen); +extern uint16_t crc16(uint8_t* buf, const uint16_t bufLen, const uint16_t startCRC, const uint16_t startBit, const uint16_t len_bits); + +//#define OUTPUT_DEBUG_INFO + +#define CRC8_INIT 0x00 +#define CRC8_POLY 0x01 + +#define CRC16_MODBUS_POLYNOM 0xA001 + +uint8_t crc8(uint8_t buf[], uint16_t len) { + uint8_t crc = CRC8_INIT; + for(uint8_t i = 0; i < len; i++) { + crc ^= buf[i]; + for(uint8_t b = 0; b < 8; b ++) { + crc = (crc << 1) ^ ((crc & 0x80) ? CRC8_POLY : 0x00); + } + } + return crc; +} + +uint16_t crc16_modbus(uint8_t buf[], uint16_t len) { + uint16_t crc = 0xffff; + uint8_t lsb; + + for(uint8_t i = 0; i < len; i++) { + crc = crc ^ buf[i]; + for(int8_t b = 7; b >= 0; b--) { + lsb = (crc & 0x0001); + if(lsb == 0x01) + crc--; + crc = crc >> 1; + if(lsb == 0x01) + crc = crc ^ CRC16_MODBUS_POLYNOM; + } + } + + return crc; +} + +// NRF24 CRC16 calculation with poly 0x1021 = (1) 0001 0000 0010 0001 = x^16+x^12+x^5+1 +uint16_t crc16(uint8_t *buf, const uint16_t bufLen, const uint16_t startCRC, const uint16_t startBit, const uint16_t len_bits) +{ + uint16_t crc = startCRC; + if ((len_bits > 0) && (len_bits <= BYTES_TO_BITS(bufLen))) + { + // The length of the data might not be a multiple of full bytes. + // Therefore we proceed over the data bit-by-bit (like the NRF24 does) to + // calculate the CRC. + uint16_t data; + uint8_t byte, shift; + uint16_t bitoffs = startBit; + + // Get a new byte for the next 8 bits. + byte = buf[bitoffs >> 3]; +#ifdef OUTPUT_DEBUG_INFO + printf_P(PSTR("\nStart CRC %04X, %u bits:"), startCRC, len_bits); + printf_P(PSTR("\nbyte %02X:"), byte); +#endif + while (bitoffs < len_bits + startBit) + { + shift = bitoffs & 7; + // Shift the active bit to the position of bit 15 + data = ((uint16_t)byte) << (8 + shift); +#ifdef OUTPUT_DEBUG_INFO + printf_P(PSTR(" bit %u %u,"), shift, data & 0x8000 ? 1 : 0); +#endif + // Assure all other bits are 0 + data &= 0x8000; + crc ^= data; + if (crc & 0x8000) + { + crc = (crc << 1) ^ 0x1021; // 0x1021 = (1) 0001 0000 0010 0001 = x^16+x^12+x^5+1 + } + else + { + crc = (crc << 1); + } + ++bitoffs; + if (0 == (bitoffs & 7)) + { + // Get a new byte for the next 8 bits. + byte = buf[bitoffs >> 3]; +#ifdef OUTPUT_DEBUG_INFO + printf_P(PSTR("crc %04X:"), crc); + if (bitoffs < len_bits + startBit) + printf_P(PSTR("\nbyte %02X:"), byte); +#endif + } + } + } + return crc; +} + +#endif diff --git a/tools/HoyDtuSim/hm_packets.h b/tools/HoyDtuSim/hm_packets.h new file mode 100644 index 00000000..c6959cd9 --- /dev/null +++ b/tools/HoyDtuSim/hm_packets.h @@ -0,0 +1,93 @@ +#ifndef __HM_PACKETS_H +#define __HM_PACKETS_H + +#include "hm_crc.h" + +class HM_Packets +{ +private: + uint32_t unixTimeStamp; + + void prepareBuffer(uint8_t *buf); + void copyToBuffer(uint8_t *buf, uint32_t val); + void copyToBufferBE(uint8_t *buf, uint32_t val); + +public: + void SetUnixTimeStamp(uint32_t ts); + void UnixTimeStampTick(); + + int32_t GetTimePacket(uint8_t *buf, uint32_t wrAdr, uint32_t dtuAdr); + int32_t GetCmdPacket(uint8_t *buf, uint32_t wrAdr, uint32_t dtuAdr, uint8_t mid, uint8_t cmd); +}; + +void HM_Packets::SetUnixTimeStamp(uint32_t ts) +{ + unixTimeStamp = ts; +} + +void HM_Packets::UnixTimeStampTick() +{ + unixTimeStamp++; +} + +void HM_Packets::prepareBuffer(uint8_t *buf) +{ + // minimal buffer size of 32 bytes is assumed + memset(buf, 0x00, 32); +} + +void HM_Packets::copyToBuffer(uint8_t *buf, uint32_t val) +{ + buf[0]= (uint8_t)(val >> 24); + buf[1]= (uint8_t)(val >> 16); + buf[2]= (uint8_t)(val >> 8); + buf[3]= (uint8_t)(val & 0xFF); +} + +void HM_Packets::copyToBufferBE(uint8_t *buf, uint32_t val) +{ + memcpy(buf, &val, sizeof(uint32_t)); +} + +static uint8_t cid = 0; + +int32_t HM_Packets::GetTimePacket(uint8_t *buf, uint32_t wrAdr, uint32_t dtuAdr) +{ + prepareBuffer(buf); + + buf[0] = 0x15; + copyToBufferBE(&buf[1], wrAdr); + copyToBufferBE(&buf[5], dtuAdr); + buf[9] = 0x80; + buf[10] = 0x0B; //0x0B; 0x03 0x11 + buf[11] = 0x00; + + copyToBuffer(&buf[12], unixTimeStamp); + + buf[19] = 0x05; + + // CRC16 + uint16_t crc16 = crc16_modbus(&buf[10], 14); + buf[24] = crc16 >> 8; + buf[25] = crc16 & 0xFF; + + // crc8 + buf[26] = crc8(&buf[0], 26); + + return 27; +} + +int32_t HM_Packets::GetCmdPacket(uint8_t *buf, uint32_t wrAdr, uint32_t dtuAdr, uint8_t mid, uint8_t cmd) +{ + buf[0] = mid; + copyToBufferBE(&buf[1], wrAdr); + copyToBufferBE(&buf[5], dtuAdr); + buf[9] = cmd; + + // crc8 + buf[10] = crc8(&buf[0], 10); + + return 11; +} + +#endif diff --git a/tools/HoyDtuSim/wifi.h b/tools/HoyDtuSim/wifi.h new file mode 100644 index 00000000..d98cc40f --- /dev/null +++ b/tools/HoyDtuSim/wifi.h @@ -0,0 +1,345 @@ +#ifndef __WIFI_H +#define __WIFI_H + +#include "Settings.h" +#include "Debug.h" +#include +#include // von url=https://www.technologytourist.com + +String SSID = ""; // bestes WLan + +// Prototypes +time_t getNow (); +boolean setupWifi (); +boolean checkWifi(); + + +String findWifi () { +//---------------- + String ssid; + int32_t rssi; + uint8_t encryptionType; + uint8_t* bssid; + int32_t channel; + bool hidden; + int scanResult; + + String best_ssid = ""; + int32_t best_rssi = -100; + + DEBUG_OUT.println(F("Starting WiFi scan...")); + + scanResult = WiFi.scanNetworks(/*async=*/false, /*hidden=*/true); + + if (scanResult == 0) { + DEBUG_OUT.println(F("keine WLans")); + } else if (scanResult > 0) { + DEBUG_OUT.printf(PSTR("%d WLans gefunden:\n"), scanResult); + + // Print unsorted scan results + for (int8_t i = 0; i < scanResult; i++) { + WiFi.getNetworkInfo(i, ssid, encryptionType, rssi, bssid, channel, hidden); + + DEBUG_OUT.printf(PSTR(" %02d: [CH %02d] [%02X:%02X:%02X:%02X:%02X:%02X] %ddBm %c %c %s\n"), + i, + channel, + bssid[0], bssid[1], bssid[2], + bssid[3], bssid[4], bssid[5], + rssi, + (encryptionType == ENC_TYPE_NONE) ? ' ' : '*', + hidden ? 'H' : 'V', + ssid.c_str()); + delay(1); + boolean check; + #ifdef SSID_PREFIX1 + check = ssid.substring(0,strlen(SSID_PREFIX1)).equals(SSID_PREFIX1); + #else + check = true; + #endif + #ifdef SSID_PREFIX2 + check = check || ssid.substring(0,strlen(SSID_PREFIX2)).equals(SSID_PREFIX2); + #endif + if (check) { + if (rssi > best_rssi) { + best_rssi = rssi; + best_ssid = ssid; + } + } + } + } else { + DEBUG_OUT.printf(PSTR("WiFi scan error %d"), scanResult); + } + + if (! best_ssid.equals("")) { + SSID = best_ssid; + DEBUG_OUT.printf ("Bestes Wifi unter: %s\n", SSID.c_str()); + return SSID; + } + else + return ""; +} + +void IP2string (IPAddress IP, char * buf) { + sprintf (buf, "%d.%d.%d.%d", IP[0], IP[1], IP[2], IP[3]); +} + +void connectWifi() { +//------------------ +// if (SSID.equals("")) + String s = findWifi(); + + if (!SSID.equals("")) { + DEBUG_OUT.print("versuche zu verbinden mit "); DEBUG_OUT.println(SSID); + //while (WiFi.status() != WL_CONNECTED) { + WiFi.begin (SSID, SSID_PASSWORD); + int versuche = 20; + while (WiFi.status() != WL_CONNECTED && versuche > 0) { + delay(1000); + versuche--; + DEBUG_OUT.print(versuche); DEBUG_OUT.print(' '); + } + //} + if (WiFi.status() == WL_CONNECTED) { + char buffer[30]; + IP2string (WiFi.localIP(), buffer); + String out = "\n[WiFi]Verbunden; meine IP:" + String (buffer); + DEBUG_OUT.println (out); + } + else + DEBUG_OUT.print("\nkeine Verbindung mit SSID "); DEBUG_OUT.println(SSID); + } +} + + +boolean setupWifi () { +//------------------ + int count=5; + while (count-- && WiFi.status() != WL_CONNECTED) + connectWifi(); + return (WiFi.status() == WL_CONNECTED); +} + + +Pinger pinger; +IPAddress ROUTER = IPAddress(192,168,1,1); + +boolean checkWifi() { +//--------------- + boolean NotConnected = (WiFi.status() != WL_CONNECTED) || !pinger.Ping(ROUTER); + if (NotConnected) { + setupWifi(); + if (WiFi.status() == WL_CONNECTED) + getNow(); + } + return (WiFi.status() == WL_CONNECTED); +} + + + +// ################ Clock ################# + +#include +#include + +IPAddress timeServer; +unsigned int localPort = 8888; +const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message +byte packetBuf[NTP_PACKET_SIZE]; // Buffer to hold incoming and outgoing packets +const int timeZone = 1; // Central European Time = +1 +long SYNCINTERVALL = 0; +WiFiUDP Udp; // A UDP instance to let us send and receive packets over UDP + +// prototypes +time_t getNtpTime (); +void sendNTPpacket (IPAddress &address); +time_t getNow (); +char* getDateTimeStr (time_t no = getNow()); +time_t offsetDayLightSaving (uint32_t local_t); +bool isDayofDaylightChange (time_t local_t); + + +void _setSyncInterval (long intervall) { +//---------------------------------------- + SYNCINTERVALL = intervall; + setSyncInterval (intervall); +} + +void setupClock() { +//----------------- + WiFi.hostByName (TIMESERVER_NAME,timeServer); // at this point the function works + + Udp.begin(localPort); + + getNtpTime(); + + setSyncProvider (getNtpTime); + while(timeStatus()== timeNotSet) + delay(1); // + + _setSyncInterval (SECS_PER_DAY / 2); // Set seconds between re-sync + + //lastClock = now(); + //Serial.print("[NTP] get time from NTP server "); + getNow(); + //char buf[20]; + DEBUG_OUT.print ("[NTP] get time from NTP server "); + DEBUG_OUT.print (timeServer); + //sprintf (buf, ": %02d:%02d:%02d", hour(no), minute(no), second(no)); + DEBUG_OUT.print (": got "); + DEBUG_OUT.println (getDateTimeStr()); +} + +//*-------- NTP code ----------*/ + + +time_t getNtpTime() { +//------------------- + sendNTPpacket(timeServer); // send an NTP packet to a time server + //uint32_t beginWait = millis(); + //while (millis() - beginWait < 1500) { + int versuch = 0; + while (versuch < 5) { + int wait = 150; // results in max 1500 ms waitTime + while (wait--) { + int size = Udp.parsePacket(); + if (size >= NTP_PACKET_SIZE) { + //Serial.println("Receive NTP Response"); + Udp.read(packetBuf, NTP_PACKET_SIZE); // read packet into the buffer + unsigned long secsSince1900; + // convert four bytes starting at location 40 to a long integer + secsSince1900 = (unsigned long)packetBuf[40] << 24; + secsSince1900 |= (unsigned long)packetBuf[41] << 16; + secsSince1900 |= (unsigned long)packetBuf[42] << 8; + secsSince1900 |= (unsigned long)packetBuf[43]; + // time_t now = secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR; + + time_t utc = secsSince1900 - 2208988800UL; + time_t now = utc + (timeZone +offsetDayLightSaving(utc)) * SECS_PER_HOUR; + + if (isDayofDaylightChange (utc) && hour(utc) <= 4) + _setSyncInterval (SECS_PER_HOUR); + else + _setSyncInterval (SECS_PER_DAY / 2); + + return now; + } + else + delay(10); + } + versuch++; + } + return 0; +} + +// send an NTP request to the time server at the given address +void sendNTPpacket(IPAddress& address) { +//------------------------------------ + memset(packetBuf, 0, NTP_PACKET_SIZE); // set all bytes in the buffer to 0 + // Initialize values needed to form NTP request + packetBuf[0] = B11100011; // LI, Version, Mode + packetBuf[1] = 0; // Stratum + packetBuf[2] = 6; // Max Interval between messages in seconds + packetBuf[3] = 0xEC; // Clock Precision + // bytes 4 - 11 are for Root Delay and Dispersion and were set to 0 by memset + packetBuf[12] = 49; // four-byte reference ID identifying + packetBuf[13] = 0x4E; + packetBuf[14] = 49; + packetBuf[15] = 52; + // send the packet requesting a timestamp: + Udp.beginPacket(address, 123); //NTP requests are to port 123 + Udp.write(packetBuf,NTP_PACKET_SIZE); + Udp.endPacket(); + +} + +int getTimeTrials = 0; + +bool isValidDateTime (time_t no) { + return (year(no) > 2020 && year(no) < 2038); +} + +bool isDayofDaylightChange (time_t local_t) { +//----------------------------------------- + int jahr = year (local_t); + int monat = month (local_t); + int tag = day (local_t); + bool ret = ( (monat ==3 && tag == (31 - (5 * jahr /4 + 4) % 7)) || + (monat==10 && tag == (31 - (5 * jahr /4 + 1) % 7))); + DEBUG_OUT.print ("isDayofDaylightChange="); DEBUG_OUT.println (ret); + return ret; +} + +// calculates the daylight saving time for middle Europe. Input: Unixtime in UTC (!) +// übernommen von Jurs, see : https://forum.arduino.cc/index.php?topic=172044.msg1278536#msg1278536 +time_t offsetDayLightSaving (uint32_t local_t) { +//-------------------------------------------- + int monat = month (local_t); + if (monat < 3 || monat > 10) return 0; // no DSL in Jan, Feb, Nov, Dez + if (monat > 3 && monat < 10) return 1; // DSL in Apr, May, Jun, Jul, Aug, Sep + int jahr = year (local_t); + int std = hour (local_t); + //int tag = day (local_t); + int stundenBisHeute = (std + 24 * day(local_t)); + if ( (monat == 3 && stundenBisHeute >= (1 + timeZone + 24 * (31 - (5 * jahr /4 + 4) % 7))) || + (monat == 10 && stundenBisHeute < (1 + timeZone + 24 * (31 - (5 * jahr /4 + 1) % 7))) ) + return 1; + else + return 0; + /* + int stundenBisWechsel = (1 + 24 * (31 - (5 * year(local_t) / 4 + 4) % 7)); + if (monat == 3 && stundenBisHeute >= stundenBisWechsel || monat == 10 && stundenBisHeute < stundenBisWechsel) + return 1; + else + return 0; + */ +} + + +time_t getNow () { +//--------------- + time_t jetzt = now(); + while (!isValidDateTime(jetzt) && getTimeTrials < 10) { // ungültig, max 10x probieren + if (getTimeTrials) { + //Serial.print (getTimeTrials); + //Serial.println(". Versuch für getNtpTime"); + } + jetzt = getNtpTime (); + if (isValidDateTime(jetzt)) { + setTime (jetzt); + getTimeTrials = 0; + } + else + getTimeTrials++; + } + //return jetzt + offsetDayLightSaving(jetzt)*SECS_PER_HOUR; + return jetzt; +} + + +char _timestr[24]; + +char* getNowStr (time_t no = getNow()) { +//------------------------------------ + sprintf (_timestr, "%02d:%02d:%02d", hour(no), minute(no), second(no)); + return _timestr; +} + +char* getTimeStr (time_t no = getNow()) { +//------------------------------------ + return getNowStr (no); +} + +char* getDateTimeStr (time_t no) { +//------------------------------ + sprintf (_timestr, "%04d-%02d-%02d+%02d:%02d:%02d", year(no), month(no), day(no), hour(no), minute(no), second(no)); + return _timestr; +} + +char* getDateStr (time_t no) { +//------------------------------ + sprintf (_timestr, "%04d-%02d-%02d", year(no), month(no), day(no)); + return _timestr; +} + + +#endif diff --git a/tools/NRF24_SendRcv/CircularBuffer.h b/tools/NRF24_SendRcv/CircularBuffer.h new file mode 100644 index 00000000..a7fafdb7 --- /dev/null +++ b/tools/NRF24_SendRcv/CircularBuffer.h @@ -0,0 +1,158 @@ +/* + CircularBuffer - An Arduino circular buffering library for arbitrary types. + + Created by Ivo Pullens, Emmission, 2014 -- www.emmission.nl + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef CircularBuffer_h +#define CircularBuffer_h + +#ifdef ESP8266 +#define DISABLE_IRQ noInterrupts() +#define RESTORE_IRQ interrupts() +#else +#define DISABLE_IRQ \ + uint8_t sreg = SREG; \ + cli(); + +#define RESTORE_IRQ \ + SREG = sreg; +#endif + +template class CircularBuffer +{ + public: + /** Constructor + * @param buffer Preallocated buffer of at least size records. + * @param size Number of records available in the buffer. + */ + CircularBuffer(T* buffer, const uint8_t size ) + : m_size(size), m_buff(buffer) + { + clear(); + } + + /** Clear all entries in the circular buffer. */ + void clear(void) + { + m_front = 0; + m_fill = 0; + } + + /** Test if the circular buffer is empty */ + inline bool empty(void) const + { + return !m_fill; + } + + /** Return the number of records stored in the buffer */ + inline uint8_t available(void) const + { + return m_fill; + } + + /** Test if the circular buffer is full */ + inline bool full(void) const + { + return m_fill == m_size; + } + + /** Aquire record on front of the buffer, for writing. + * After filling the record, it has to be pushed to actually + * add it to the buffer. + * @return Pointer to record, or NULL when buffer is full. + */ + T* getFront(void) const + { + DISABLE_IRQ; + T* f = NULL; + if (!full()) + f = get(m_front); + RESTORE_IRQ; + return f; + } + + /** Push record to front of the buffer + * @param record Record to push. If record was aquired previously (using getFront) its + * data will not be copied as it is already present in the buffer. + * @return True, when record was pushed successfully. + */ + bool pushFront(T* record) + { + bool ok = false; + DISABLE_IRQ; + if (!full()) + { + T* f = get(m_front); + if (f != record) + *f = *record; + m_front = (m_front+1) % m_size; + m_fill++; + ok = true; + } + RESTORE_IRQ; + return ok; + } + + /** Aquire record on back of the buffer, for reading. + * After reading the record, it has to be pop'ed to actually + * remove it from the buffer. + * @return Pointer to record, or NULL when buffer is empty. + */ + T* getBack(void) const + { + T* b = NULL; + DISABLE_IRQ; + if (!empty()) + b = get(back()); + RESTORE_IRQ; + return b; + } + + /** Remove record from back of the buffer. + * @return True, when record was pop'ed successfully. + */ + bool popBack(void) + { + bool ok = false; + DISABLE_IRQ; + if (!empty()) + { + m_fill--; + ok = true; + } + RESTORE_IRQ; + return ok; + } + + protected: + inline T * get(const uint8_t idx) const + { + return &(m_buff[idx]); + } + inline uint8_t back(void) const + { + return (m_front - m_fill + m_size) % m_size; + } + + const uint8_t m_size; // Total number of records that can be stored in the buffer. + T* const m_buff; // Ptr to buffer holding all records. + volatile uint8_t m_front; // Index of front element (not pushed yet). + volatile uint8_t m_fill; // Amount of records currently pushed. +}; + +#endif // CircularBuffer_h diff --git a/tools/NRF24_SendRcv/Debug.h b/tools/NRF24_SendRcv/Debug.h new file mode 100644 index 00000000..3b2807d6 --- /dev/null +++ b/tools/NRF24_SendRcv/Debug.h @@ -0,0 +1,23 @@ +#ifndef __DEBUG_H + +#define __DEBUG_H + +#ifdef DEBUG + #define DEBUG_OUT Serial +#else +//--- +// disable Serial DEBUG output + #define DEBUG_OUT DummySerial + static class { + public: + void begin(...) {} + void print(...) {} + void println(...) {} + void flush() {} + bool available() { return false;} + int readBytes(...) { return 0;} + int printf (...) {return 0;} + } DummySerial; +#endif + +#endif diff --git a/tools/NRF24_SendRcv/ModWebserver.h b/tools/NRF24_SendRcv/ModWebserver.h new file mode 100644 index 00000000..38bb77f5 --- /dev/null +++ b/tools/NRF24_SendRcv/ModWebserver.h @@ -0,0 +1,129 @@ +// ################# WebServer ################# + +#ifndef __MODWEBSERVER_H +#define __MODWEBSERVER_H +#define MODWEBSERVER + +#include +#include "Debug.h" +#include "Settings.h" + +ESP8266WebServer server (WEBSERVER_PORT); + + +void returnOK () { + //-------------- + server.send(200, F("text/plain"), ""); +} + + +void returnFail(String msg) { + //------------------------- + server.send(500, F("text/plain"), msg + "\r\n"); +} + +void handleHelp () { +//----------------- + String out = ""; + out += "

Hilfe

"; + out += "

"; + out += ""; + out += ""; + out += ""; + out += ""; + out += "
/zeigt alle Messwerte in einer Tabelle; refresh alle 10 Sekunden
/datazum Abruf der Messwerte in der Form Name=wert
:{port+1}/updateOTA
/rebootstartet neu
"; + server.send (200, "text/html", out); +} + + +void handleReboot () { + //------------------- + returnOK (); + ESP.reset(); +} + + +void handleRoot() { + //---------------- + String out = ""; + out += ""; + out += "

Hoymiles Micro-Inverter HM-600

"; + out += "

"; + out += ""; + for (byte i = 0; i < ANZAHL_VALUES; i++) { + out += ""; + out += ""; + } + out += "
KanalWert
" + String(getChannelName(i)) + "" + String(VALUES[i]) + "
"; + out += ""; + server.send (200, "text/html", out); + //DEBUG_OUT.println (out); +} + + +void handleData () { +//----------------- + String out = ""; + for (int i = 0; i < ANZAHL_VALUES; i++) { + out += String(getChannelName(i)) + '=' + String (VALUES[i]) + '\n'; + } + server.send(200, "text/plain", out); +} + + +void handleNotFound() { +//-------------------- + String message = "URI: "; + message += server.uri(); + message += "\nMethod: "; + message += (server.method() == HTTP_GET) ? "GET" : "POST"; + message += "\nArguments: "; + message += server.args(); + message += "\n"; + for (uint8_t i = 0; i < server.args(); i++) { + message += " NAME:" + server.argName(i) + "\n VALUE:" + server.arg(i) + "\n"; + } + server.send(404, "text/plain", message); +} + + +void setupWebServer (void) { + //------------------------- + server.on("/", handleRoot); + server.on("/reboot", handleReboot); + server.on("/data", handleData); + server.on("/help", handleHelp); + //server.onNotFound(handleNotFound); wegen Spiffs-Dateimanager + + server.begin(); + DEBUG_OUT.println ("[HTTP] installed"); +} + +void webserverHandle() { +//==================== + server.handleClient(); +} + + +// ################# OTA ################# + +#ifdef WITH_OTA +#include + +ESP8266WebServer httpUpdateServer (UPDATESERVER_PORT); +ESP8266HTTPUpdateServer httpUpdater; + +void setupUpdateByOTA () { + //------------------------ + httpUpdater.setup (&httpUpdateServer, UPDATESERVER_DIR, UPDATESERVER_USER, UPDATESERVER_PW); + httpUpdateServer.begin(); + DEBUG_OUT.println (F("[OTA] installed")); +} + +void checkUpdateByOTA() { +//--------------------- + httpUpdateServer.handleClient(); +} +#endif + +#endif diff --git a/tools/NRF24_SendRcv/NRF24_SendRcv.ino b/tools/NRF24_SendRcv/NRF24_SendRcv.ino new file mode 100644 index 00000000..9eed320d --- /dev/null +++ b/tools/NRF24_SendRcv/NRF24_SendRcv.ino @@ -0,0 +1,597 @@ +#include +#include +#include "CircularBuffer.h" +#include +#include +#include "hm_crc.h" +#include "hm_packets.h" + +#include "Settings.h" // Header für Einstellungen + +#include "Debug.h" + +#ifdef ESP8266 + #define DISABLE_EINT noInterrupts() + #define ENABLE_EINT interrupts() +#else // für AVR z.B. ProMini oder Nano + #define DISABLE_EINT EIMSK = 0x00 + #define ENABLE_EINT EIMSK = 0x01 +#endif + + +#define RF_MAX_ADDR_WIDTH (5) +#define MAX_RF_PAYLOAD_SIZE (32) + +#ifdef ESP8266 +#define PACKET_BUFFER_SIZE (30) +#else +#define PACKET_BUFFER_SIZE (20) +#endif + +// Startup defaults until user reconfigures it +#define DEFAULT_RECV_CHANNEL (3) // 3 = Default channel for Hoymiles +//#define DEFAULT_SEND_CHANNEL (75) // 40 = Default channel for Hoymiles, 61 +#define DEFAULT_RF_DATARATE (RF24_250KBPS) // Datarate + +#include "NRF24_sniff_types.h" + +static HM_Packets hmPackets; +static uint32_t tickMillis; + + +// Set up nRF24L01 radio on SPI bus plus CE/CS pins +// If more than one RF24 unit is used the another CS pin than 10 must be used +// This pin is used hard coded in SPI library +static RF24 radio1 (RF1_CE_PIN, RF1_CS_PIN); + +static NRF24_packet_t bufferData[PACKET_BUFFER_SIZE]; + +static CircularBuffer packetBuffer(bufferData, sizeof(bufferData) / sizeof(bufferData[0])); + +static Serial_header_t SerialHdr; + +#define CHECKCRC 1 +static uint16_t lastCRC; +static uint16_t crc; + +uint8_t channels[] = {/*3,*/ 23, 40, 61, 75}; //{1, 3, 6, 9, 11, 23, 40, 61, 75} +uint8_t channelIdx = 1; // fange mit 40 an +uint8_t DEFAULT_SEND_CHANNEL = channels[channelIdx]; // = 40 + +static unsigned long timeLastPacket = millis(); + +// Function forward declaration +static void SendPacket(uint64_t dest, uint8_t *buf, uint8_t len); +char * getChannelName (uint8_t i); + +static const int ANZAHL_VALUES = 16; +static float VALUES[ANZAHL_VALUES] = {}; +static const char *CHANNEL_NAMES[ANZAHL_VALUES] + = {"P1.Udc", "P1.Idc", "P1.Pdc", "P2.Udc", "P2.Idc", "P2.Pdc", + "E-Woche", "E-Total", "E1-Tag", "E2-Tag", "Uac", "Freq.ac", "Pac", "E-heute", "Ipv", "WR-Temp"}; +static const uint8_t DIVISOR[ANZAHL_VALUES] = {10,100,10,10,100,10,1,1,1,1,10,100,10,0,0,10}; + +static const char BLANK = ' '; + +static boolean istTag = true; + +char CHANNELNAME_BUFFER[15]; + +#ifdef ESP8266 + #include "wifi.h" + #include "ModWebserver.h" + #include "Sonne.h" +#endif + +char * getChannelName (uint8_t i) { +//------------------------------- + memset (CHANNELNAME_BUFFER, 0, sizeof(CHANNELNAME_BUFFER)); + strcpy (CHANNELNAME_BUFFER, CHANNEL_NAMES[i]); + //itoa (i, CHANNELNAME_BUFFER, 10); + return CHANNELNAME_BUFFER; +} + +inline static void dumpData(uint8_t *p, int len) { +//----------------------------------------------- + while (len--){ + if (*p < 16) + DEBUG_OUT.print(F("0")); + DEBUG_OUT.print(*p++, HEX); + } + DEBUG_OUT.print(BLANK); +} + + +float extractValue2 (uint8_t *p, int divisor) { +//------------------------------------------- + uint16_t b1 = *p++; + return ((float) (b1 << 8) + *p) / (float) divisor; +} + + +float extractValue4 (uint8_t *p, int divisor) { +//------------------------------------------- + uint32_t ret = *p++; + for (uint8_t i = 1; i <= 3; i++) + ret = (ret << 8) + *p++; + return (ret / divisor); +} + +void outChannel (uint8_t i) { +//------------------------- + DEBUG_OUT.print(getChannelName(i)); DEBUG_OUT.print(F("\t:")); DEBUG_OUT.print(VALUES[i]); DEBUG_OUT.println(BLANK); +} + + +void analyse01 (uint8_t *p) { // p zeigt auf 01 hinter 2. WR-Adr +//---------------------------------- + //uint16_t val; + //DEBUG_OUT.print (F("analyse 01: ")); + p += 3; + // PV1.U PV1.I PV1.P PV2.U PV2.I PV2.P + // [0.1V] [0.01A] [.1W] [0.1V] [0.01A] [.1W] + for (int i = 0; i < 6; i++) { + VALUES[i] = extractValue2 (p,DIVISOR[i]); p += 2; + outChannel(i); + } +/* + DEBUG_OUT.print(F("PV1.U:")); DEBUG_OUT.print(extractValue2(p,10)); + p += 2; + DEBUG_OUT.print(F(" PV1.I:")); DEBUG_OUT.print(extractValue2(p,100)); + p += 2; + DEBUG_OUT.print(F(" PV1.Pac:")); DEBUG_OUT.print(extractValue2(p,10)); + p += 2; + DEBUG_OUT.print(F(" PV2.U:")); DEBUG_OUT.print(extractValue2(p,10)); + p += 2; + DEBUG_OUT.print(F(" PV2.I:")); DEBUG_OUT.print(extractValue2(p,100)); + p += 2; + DEBUG_OUT.print(F(" PV2.Pac:")); DEBUG_OUT.print(extractValue2(p,10)); +*/ + DEBUG_OUT.println(); +} + + +void analyse02 (uint8_t *p) { // p zeigt auf 02 hinter 2. WR-Adr +//---------------------------------- + //uint16_t val; + //DEBUG_OUT.print (F("analyse 02: ")); + // +11 = Spannung, +13 = Frequenz, +15 = Leistung + //p += 11; + p++; + for (int i = 6; i < 13; i++) { + if (i == 7) { + VALUES[i] = extractValue4 (p,DIVISOR[i]); + p += 4; + } + else { + VALUES[i] = extractValue2 (p,DIVISOR[i]); + p += 2; + } + outChannel(i); + } + VALUES[13] = VALUES[8] + VALUES[9]; // E-heute = P1+P2 + if (VALUES[10] > 0) + VALUES[14] = VALUES[12] / VALUES[10]; // Ipv = Pac / Spannung +/* + DEBUG_OUT.print(F("P Woche:")); DEBUG_OUT.print(extractValue2(p,1)); + p += 2; + DEBUG_OUT.print(F(" P Total:")); DEBUG_OUT.print(extractValue4(p,1)); + p += 4; + DEBUG_OUT.print(F(" P1 Tag:")); DEBUG_OUT.print(extractValue2(p,1)); + p += 2; + DEBUG_OUT.print(F(" P2 Tag:")); DEBUG_OUT.print(extractValue2(p,1)); + p += 2; + + DEBUG_OUT.print(F(" Spannung:")); DEBUG_OUT.print(extractValue2(p,10)); + p += 2; + DEBUG_OUT.print(F(" Freq.:")); DEBUG_OUT.print(extractValue2(p,100)); + p += 2; + DEBUG_OUT.print(F(" Leist.:")); DEBUG_OUT.print(extractValue2(p,10)); +*/ + DEBUG_OUT.println(); +} + + +void analyse83 (uint8_t *p) { // p zeigt auf 83 hinter 2. WR-Adr +//---------------------------------- + //uint16_t val; + //DEBUG_OUT.print (F("++++++analyse 83:")); + p += 7; + VALUES[15] = extractValue2 (p,DIVISOR[15]); + outChannel(15); + DEBUG_OUT.println(); +} + +void analyseWords (uint8_t *p) { // p zeigt auf 01 hinter 2. WR-Adr +//---------------------------------- + //uint16_t val; + DEBUG_OUT.print (F("analyse words:")); + p++; + for (int i = 0; i <12;i++) { + DEBUG_OUT.print(extractValue2(p,1)); + DEBUG_OUT.print(BLANK); + p++; + } + DEBUG_OUT.println(); +} + +void analyseLongs (uint8_t *p) { // p zeigt auf 01 hinter 2. WR-Adr +//---------------------------------- + //uint16_t val; + DEBUG_OUT.print (F("analyse words:")); + p++; + for (int i = 0; i <12;i++) { + DEBUG_OUT.print(extractValue4(p,1)); + DEBUG_OUT.print(BLANK); + p++; + } + DEBUG_OUT.println(); +} + + +#ifdef ESP8266 +IRAM_ATTR +#endif +void handleNrf1Irq() { +//------------------------- + static uint8_t lostPacketCount = 0; + uint8_t pipe; + + DISABLE_EINT; + + // Loop until RX buffer(s) contain no more packets. + while (radio1.available(&pipe)) { + if (!packetBuffer.full()) { + NRF24_packet_t *p = packetBuffer.getFront(); + p->timestamp = micros(); // Micros does not increase in interrupt, but it can be used. + p->packetsLost = lostPacketCount; + uint8_t packetLen = radio1.getPayloadSize(); + if (packetLen > MAX_RF_PAYLOAD_SIZE) + packetLen = MAX_RF_PAYLOAD_SIZE; + + radio1.read(p->packet, packetLen); + packetBuffer.pushFront(p); + lostPacketCount = 0; + } + else { + // Buffer full. Increase lost packet counter. + bool tx_ok, tx_fail, rx_ready; + if (lostPacketCount < 255) + lostPacketCount++; + // Call 'whatHappened' to reset interrupt status. + radio1.whatHappened(tx_ok, tx_fail, rx_ready); + // Flush buffer to drop the packet. + radio1.flush_rx(); + } + } + ENABLE_EINT; +} + + +static void activateConf(void) { +//----------------------------- + radio1.setChannel(DEFAULT_RECV_CHANNEL); + radio1.setDataRate(DEFAULT_RF_DATARATE); + radio1.disableCRC(); + radio1.setAutoAck(0x00); + radio1.setPayloadSize(MAX_RF_PAYLOAD_SIZE); + radio1.setAddressWidth(5); + radio1.openReadingPipe(1, DTU_RADIO_ID); + + // We want only RX irqs + radio1.maskIRQ(true, true, false); + + // Use lo PA level, as a higher level will disturb CH340 DEBUG_OUT usb adapter + radio1.setPALevel(RF24_PA_MAX); + radio1.startListening(); + + // Attach interrupt handler to NRF IRQ output. Overwrites any earlier handler. + attachInterrupt(digitalPinToInterrupt(RF1_IRQ_PIN), handleNrf1Irq, FALLING); // NRF24 Irq pin is active low. + + // Initialize SerialHdr header's address member to promiscuous address. + uint64_t addr = DTU_RADIO_ID; + for (int8_t i = sizeof(SerialHdr.address) - 1; i >= 0; --i) { + SerialHdr.address[i] = addr; + addr >>= 8; + } + +#ifndef ESP8266 + DEBUG_OUT.println(F("\nRadio Config:")); + radio1.printPrettyDetails(); + DEBUG_OUT.println(); +#endif + tickMillis = millis() + 200; +} + + +void setup(void) { +//-------------- + //Serial.begin(SER_BAUDRATE); + DEBUG_OUT.begin(SER_BAUDRATE); + DEBUG_OUT.flush(); + + DEBUG_OUT.println(F("-- Hoymiles DTU Simulation --")); + + radio1.begin(); + + // Disable shockburst for receiving and decode payload manually + radio1.setAutoAck(false); + radio1.setRetries(0, 0); + + // Configure nRF IRQ input + pinMode(RF1_IRQ_PIN, INPUT); + + activateConf(); + +#ifdef ESP8266 + setupWifi(); + setupClock(); + setupWebServer(); + setupUpdateByOTA(); + calcSunUpDown (getNow()); + istTag = isDayTime(); + DEBUG_OUT.print ("Es ist "); DEBUG_OUT.println (istTag?"Tag":"Nacht"); + hmPackets.SetUnixTimeStamp (getNow()); +#else + hmPackets.SetUnixTimeStamp(0x62456430); +#endif +} + + uint8_t sendBuf[MAX_RF_PAYLOAD_SIZE]; + +void isTime2Send () { +//----------------- + // Second timer + + if (millis() >= tickMillis) { + static uint8_t tel = 0; + tickMillis += 1000; //200; + //tickSec++; + hmPackets.UnixTimeStampTick(); +/* if (++tickSec >= 5) { // 5 + hmPackets.UnixTimeStampTick(); + tickSec = 0; + } */ + + int32_t size = 0; + uint64_t dest = WR1_RADIO_ID; + + if (tel > 5) + tel = 0; + + if (tel == 0) { + #ifdef ESP8266 + hmPackets.SetUnixTimeStamp (getNow()); + #endif + size = hmPackets.GetTimePacket((uint8_t *)&sendBuf, dest >> 8, DTU_RADIO_ID >> 8); + } + else if (tel == 1) + size = hmPackets.GetCmdPacket((uint8_t *)&sendBuf, dest >> 8, DTU_RADIO_ID >> 8, 0x15, 0x81); + else if (tel == 2) + size = hmPackets.GetCmdPacket((uint8_t *)&sendBuf, dest >> 8, DTU_RADIO_ID >> 8, 0x15, 0x80); + else if (tel == 3) { + size = hmPackets.GetCmdPacket((uint8_t *)&sendBuf, dest >> 8, DTU_RADIO_ID >> 8, 0x15, 0x83); + //tel = 0; + } + else if (tel == 4) + size = hmPackets.GetCmdPacket((uint8_t *)&sendBuf, dest >> 8, DTU_RADIO_ID >> 8, 0x15, 0x82); + else if (tel == 5) + size = hmPackets.GetCmdPacket((uint8_t *)&sendBuf, dest >> 8, DTU_RADIO_ID >> 8, 0x15, 0x84); + + SendPacket(dest, (uint8_t *)&sendBuf, size); + + tel++; + +/* for (uint8_t warte = 0; warte < 2; warte++) { + delay(1000); + hmPackets.UnixTimeStampTick(); + }*/ + } +} + + +void outputPacket(NRF24_packet_t *p, uint8_t payloadLen) { +//----------------------------------------------------- + + // Write timestamp, packets lost, address and payload length + //printf(" %09lu ", SerialHdr.timestamp); + dumpData((uint8_t *)&SerialHdr.packetsLost, sizeof(SerialHdr.packetsLost)); + dumpData((uint8_t *)&SerialHdr.address, sizeof(SerialHdr.address)); + + // Trailing bit?!? + dumpData(&p->packet[0], 2); + + // Payload length from PCF + dumpData(&payloadLen, sizeof(payloadLen)); + + // Packet control field - PID Packet identification + uint8_t val = (p->packet[1] >> 1) & 0x03; + DEBUG_OUT.print(val); + DEBUG_OUT.print(F(" ")); + + if (payloadLen > 9) { + dumpData(&p->packet[2], 1); + dumpData(&p->packet[3], 4); + dumpData(&p->packet[7], 4); + + uint16_t remain = payloadLen - 2 - 1 - 4 - 4 + 4; + + if (remain < 32) { + dumpData(&p->packet[11], remain); + printf_P(PSTR("%04X "), crc); + + if (((crc >> 8) != p->packet[payloadLen + 2]) || ((crc & 0xFF) != p->packet[payloadLen + 3])) + DEBUG_OUT.print(0); + else + DEBUG_OUT.print(1); + } + else { + DEBUG_OUT.print(F("Ill remain ")); + DEBUG_OUT.print(remain); + } + } + else { + dumpData(&p->packet[2], payloadLen + 2); + printf_P(PSTR("%04X "), crc); + } + DEBUG_OUT.println(); +} + + +void loop(void) { +//============= + while (!packetBuffer.empty()) { + timeLastPacket = millis(); + // One or more records present + NRF24_packet_t *p = packetBuffer.getBack(); + + // Shift payload data due to 9-bit packet control field + for (int16_t j = sizeof(p->packet) - 1; j >= 0; j--) { + if (j > 0) + p->packet[j] = (byte)(p->packet[j] >> 7) | (byte)(p->packet[j - 1] << 1); + else + p->packet[j] = (byte)(p->packet[j] >> 7); + } + + SerialHdr.timestamp = p->timestamp; + SerialHdr.packetsLost = p->packetsLost; + + // Check CRC + crc = 0xFFFF; + crc = crc16((uint8_t *)&SerialHdr.address, sizeof(SerialHdr.address), crc, 0, BYTES_TO_BITS(sizeof(SerialHdr.address))); + // Payload length + uint8_t payloadLen = ((p->packet[0] & 0x01) << 5) | (p->packet[1] >> 3); + // Add one byte and one bit for 9-bit packet control field + crc = crc16((uint8_t *)&p->packet[0], sizeof(p->packet), crc, 7, BYTES_TO_BITS(payloadLen + 1) + 1); + + if (CHECKCRC) { + // If CRC is invalid only show lost packets + if (((crc >> 8) != p->packet[payloadLen + 2]) || ((crc & 0xFF) != p->packet[payloadLen + 3])) { + if (p->packetsLost > 0) { + DEBUG_OUT.print(F(" Lost: ")); + DEBUG_OUT.println(p->packetsLost); + } + packetBuffer.popBack(); + continue; + } + + // Dump a decoded packet only once + if (lastCRC == crc) { + packetBuffer.popBack(); + continue; + } + lastCRC = crc; + } + + // Don't dump mysterious ack packages + if (payloadLen == 0) { + packetBuffer.popBack(); + continue; + } + + #ifdef DEBUG + outputPacket (p, payloadLen); + #endif + + uint8_t cmd = p->packet[11]; + if (cmd == 0x02) + analyse02 (&p->packet[11]); + else if (cmd == 0x01) + analyse01 (&p->packet[11]); + //if (p->packet[11] == 0x83 || p->packet[11] == 0x82) analyse83 (&p->packet[11], payloadLen); + else if (cmd == 0x03) { + analyseWords (&p->packet[11]); + analyseLongs (&p->packet[11]); + } + else if (cmd == 0x81) // ??? + ; + else if (cmd == 0x83) + analyse83 (&p->packet[11]); + else { + DEBUG_OUT.print (F("---- neues cmd=")); DEBUG_OUT.println(cmd, HEX); + analyseWords (&p->packet[11]); + analyseLongs (&p->packet[11]); + } + if (p->packetsLost > 0) { + DEBUG_OUT.print(F(" Lost: ")); + DEBUG_OUT.print(p->packetsLost); + } + DEBUG_OUT.println(); + + #ifndef ESP8266 + for (uint8_t i = 0; i < ANZAHL_VALUES; i++) { + //outChannel(i); + Serial.print(getChannelName(i)); Serial.print(':'); Serial.print(VALUES[i]); Serial.println(BLANK); // Schnittstelle bei Arduino + } + DEBUG_OUT.println(); + #endif + + // Remove record as we're done with it. + packetBuffer.popBack(); + } + + if (istTag) + isTime2Send(); + + #ifdef ESP8266 + checkWifi(); + webserverHandle(); + checkUpdateByOTA(); + if (hour() == 0 && minute() == 0) { + calcSunUpDown(getNow()); + } + if (minute() % 15 == 0 && second () == 0) { // alle 15 Minuten neu berechnen ob noch hell + istTag = isDayTime(); + DEBUG_OUT.print ("Es ist "); DEBUG_OUT.println (istTag?"Tag":"Nacht"); + } + #endif +/* + if (millis() > timeLastPacket + 60UL*SECOND) { // 60 Sekunden + channelIdx++; + if (channelIdx >= sizeof(channels)) channelIdx = 0; + DEFAULT_SEND_CHANNEL = channels[channelIdx]; + DEBUG_OUT.print (F("\nneuer DEFAULT_SEND_CHANNEL: ")); DEBUG_OUT.println(DEFAULT_SEND_CHANNEL); + timeLastPacket = millis(); + } +*/ +} + + +static void SendPacket(uint64_t dest, uint8_t *buf, uint8_t len) { +//-------------------------------------------------------------- + DISABLE_EINT; + radio1.stopListening(); + +#ifdef CHANNEL_HOP + static uint8_t hop = 0; + #if DEBUG_SEND + DEBUG_OUT.print(F("Send... CH")); + DEBUG_OUT.println(channels[hop]); + #endif + radio1.setChannel(channels[hop++]); + if (hop >= sizeof(channels) / sizeof(channels[0])) + hop = 0; +#else + radio1.setChannel(DEFAULT_SEND_CHANNEL); +#endif + + radio1.openWritingPipe(dest); + radio1.setCRCLength(RF24_CRC_16); + radio1.enableDynamicPayloads(); + radio1.setAutoAck(true); + radio1.setRetries(3, 15); + + radio1.write(buf, len); + + // Try to avoid zero payload acks (has no effect) + radio1.openWritingPipe(DUMMY_RADIO_ID); + + radio1.setAutoAck(false); + radio1.setRetries(0, 0); + radio1.disableDynamicPayloads(); + radio1.setCRCLength(RF24_CRC_DISABLED); + + radio1.setChannel(DEFAULT_RECV_CHANNEL); + radio1.startListening(); + ENABLE_EINT; +} diff --git a/tools/NRF24_SendRcv/NRF24_sniff_types.h b/tools/NRF24_SendRcv/NRF24_sniff_types.h new file mode 100644 index 00000000..7a032df5 --- /dev/null +++ b/tools/NRF24_SendRcv/NRF24_sniff_types.h @@ -0,0 +1,55 @@ +/* + This file is part of NRF24_Sniff. + + Created by Ivo Pullens, Emmission, 2014 -- www.emmission.nl + + NRF24_Sniff is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + NRF24_Sniff is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with NRF24_Sniff. If not, see . +*/ + +#ifndef NRF24_sniff_types_h +#define NRF24_sniff_types_h + +typedef struct _NRF24_packet_t +{ + uint32_t timestamp; + uint8_t packetsLost; + uint8_t packet[MAX_RF_PAYLOAD_SIZE]; +} NRF24_packet_t; + +typedef struct _Serial_header_t +{ + unsigned long timestamp; + uint8_t packetsLost; + uint8_t address[RF_MAX_ADDR_WIDTH]; // MSB first, always RF_MAX_ADDR_WIDTH bytes. +} Serial_header_t; + +typedef struct _Serial_config_t +{ + uint8_t channel; + uint8_t rate; // rf24_datarate_e: 0 = 1Mb/s, 1 = 2Mb/s, 2 = 250Kb/s + uint8_t addressLen; // Number of bytes used in address, range [2..5] + uint8_t addressPromiscLen; // Number of bytes used in promiscuous address, range [2..5]. E.g. addressLen=5, addressPromiscLen=4 => 1 byte unique identifier. + uint64_t address; // Base address, LSB first. + uint8_t crcLength; // Length of active CRC, range [0..2] + uint8_t maxPayloadSize; // Maximum size of payload for nRF (including nRF header), range[4?..32] +} Serial_config_t; + +#define MSG_TYPE_PACKET (0) +#define MSG_TYPE_CONFIG (1) + +#define SET_MSG_TYPE(var,type) (((var) & 0x3F) | ((type) << 6)) +#define GET_MSG_TYPE(var) ((var) >> 6) +#define GET_MSG_LEN(var) ((var) & 0x3F) + +#endif // NRF24_sniff_types_h diff --git a/tools/NRF24_SendRcv/Settings.h b/tools/NRF24_SendRcv/Settings.h new file mode 100644 index 00000000..27e2453d --- /dev/null +++ b/tools/NRF24_SendRcv/Settings.h @@ -0,0 +1,82 @@ +#ifndef __SETTINGS_H +#define __SETTINGS_H + +// Ausgabe von Debug Infos auf der seriellen Console +#define DEBUG +#define SER_BAUDRATE (115200) + +// Ausgabe was gesendet wird; 0 oder 1 +#define DEBUG_SEND 0 + +// soll zwichen den Sendekanälen 23, 40, 61, 75 ständig gewechselt werden +#define CHANNEL_HOP + +// mit OTA Support, also update der Firmware über WLan mittels IP/update +#define WITH_OTA + +// Hardware configuration +#ifdef ESP8266 +#define RF1_CE_PIN (D4) +#define RF1_CS_PIN (D8) +#define RF1_IRQ_PIN (D3) +#else +#define RF1_CE_PIN (9) +#define RF1_CS_PIN (10) +#define RF1_IRQ_PIN (2) +#endif + +union longlongasbytes { + uint64_t ull; + uint8_t bytes[8]; +}; + + +uint64_t Serial2RadioID (uint64_t sn) { +//---------------------------------- + longlongasbytes llsn; + longlongasbytes res; + llsn.ull = sn; + res.ull = 0; + res.bytes[4] = llsn.bytes[0]; + res.bytes[3] = llsn.bytes[1]; + res.bytes[2] = llsn.bytes[2]; + res.bytes[1] = llsn.bytes[3]; + res.bytes[0] = 0x01; + return res.ull; +} + +// WR und DTU +#define DUMMY_RADIO_ID ((uint64_t)0xDEADBEEF01ULL) +#define SerialWR 0x114172607952ULL // <<<<<<<<<<<<<<<<<<<<<<< anpassen +uint64_t WR1_RADIO_ID = Serial2RadioID (SerialWR); // ((uint64_t)0x5279607201ULL); +#define DTU_RADIO_ID ((uint64_t)0x1234567801ULL) + + +// Webserver +#define WEBSERVER_PORT 80 + +// Time Server +//#define TIMESERVER_NAME "pool.ntp.org" +#define TIMESERVER_NAME "fritz.box" + +#ifdef WITH_OTA +// OTA Einstellungen +#define UPDATESERVER_PORT WEBSERVER_PORT+1 +#define UPDATESERVER_DIR "/update" // mittels IP:81/update kommt man dann auf die OTA-Seite +#define UPDATESERVER_USER "username_für_OTA" // <<<<<<<<<<<<<<<<<<<<<<< anpassen +#define UPDATESERVER_PW "passwort_für_OTA" // <<<<<<<<<<<<<<<<<<<<<<< anpassen +#endif + +// internes WLan +// PREFIXE dienen dazu, die eigenen WLans (wenn mehrere) vonfremden zu unterscheiden +// gehe hier davon aus, dass alle WLans das gleiche Passwort haben. Wenn nicht, dann mehre Passwörter hinterlegen +#define SSID_PREFIX1 "wlan1-Prefix" // <<<<<<<<<<<<<<<<<<<<<<< anpassen +#define SSID_PREFIX2 "wlan2-Prefix" // <<<<<<<<<<<<<<<<<<<<<<< anpassen +#define SSID_PASSWORD "wlan-passwort" // <<<<<<<<<<<<<<<<<<<<<<< anpassen + +// zur Berechnung von Sonnenauf- und -untergang +#define geoBreite 49.2866 +#define geoLaenge 7.3416 + + +#endif diff --git a/tools/NRF24_SendRcv/Sonne.h b/tools/NRF24_SendRcv/Sonne.h new file mode 100644 index 00000000..ce70a150 --- /dev/null +++ b/tools/NRF24_SendRcv/Sonne.h @@ -0,0 +1,55 @@ +#ifndef __SONNE_H +#define __SONNE_H + +#include "Settings.h" +#include "Debug.h" + + +long SunDown, SunUp; + +void calcSunUpDown (time_t date) { + //SunUpDown res = new SunUpDown(); + boolean isSummerTime = false; // TODO TimeZone.getDefault().inDaylightTime(new Date(date)); + + //- Bogenma� + double brad = geoBreite / 180.0 * PI; + // - H�he Sonne -50 Bogenmin. + double h0 = -50.0 / 60.0 / 180.0 * PI; + //- Deklination dek, Tag des Jahres d0 + int tage = 30 * month(date) - 30 + day(date); + double dek = 0.40954 * sin (0.0172 * (tage - 79.35)); + double zh1 = sin (h0) - sin (brad) * sin(dek); + double zh2 = cos(brad) * cos(dek); + double zd = 12*acos (zh1/zh2) / PI; + double zgl = -0.1752 * sin (0.03343 * tage + 0.5474) - 0.134 * sin (0.018234 * tage - 0.1939); + //-Sonnenuntergang + double tsu = 12 + zd - zgl; + double su = (tsu + (15.0 - geoLaenge) / 15.0); + int std = (int)su; + int minute = (int) ((su - std)*60); + if (isSummerTime) std++; + SunDown = (100*std + minute) * 100; + + //- Sonnenaufgang + double tsa = 12 - zd - zgl; + double sa = (tsa + (15.0 - geoLaenge) /15.0); + std = (int) sa; + minute = (int) ((sa - std)*60); + if (isSummerTime) std++; + SunUp = (100*std + minute) * 100; + DEBUG_OUT.print("Sonnenaufgang :"); DEBUG_OUT.println(SunUp); + DEBUG_OUT.print("Sonnenuntergang:"); DEBUG_OUT.println(SunDown); +} + +boolean isDayTime() { +//----------------- +// 900 = 15 Minuten, vor Sonnenaufgang und nach -untergang + const int offset=60*15; + time_t no = getNow(); + long jetztMinuteU = (100 * hour(no+offset) + minute(no+offset)) * 100; + long jetztMinuteO = (100 * hour(no-offset) + minute(no-offset)) * 100; + + return ((jetztMinuteU >= SunUp) &&(jetztMinuteO <= SunDown)); +} + +#endif diff --git a/tools/NRF24_SendRcv/hm_crc.cpp b/tools/NRF24_SendRcv/hm_crc.cpp new file mode 100644 index 00000000..74d41ce3 --- /dev/null +++ b/tools/NRF24_SendRcv/hm_crc.cpp @@ -0,0 +1,142 @@ + +#include +#include +#include "hm_crc.h" +//#define OUTPUT_DEBUG_INFO + +/* Table of CRC values for high-order byte */ +static const uint8_t auchCRCHi[] = { + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, + 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, + 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, + 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, + 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, + 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, + 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, + 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, + 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, + 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, + 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, + 0x40}; + +/* Table of CRC values for low-order byte */ +static const uint8_t auchCRCLo[] = { + 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, + 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, + 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, + 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, + 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, + 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, + 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, + 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, + 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, + 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, + 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, + 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, + 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, + 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, + 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, + 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, + 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, + 0x40}; + +uint16_t crc16_modbus(uint8_t *puchMsg, uint16_t usDataLen) +{ + uint8_t uchCRCHi = 0xFF; /* high byte of CRC initialized */ + uint8_t uchCRCLo = 0xFF; /* low byte of CRC initialized */ + uint16_t uIndex; /* will index into CRC lookup table */ + while (usDataLen--) /* pass through message buffer */ + { + uIndex = uchCRCLo ^ *puchMsg++; /* calculate the CRC */ + uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex]; + uchCRCHi = auchCRCLo[uIndex]; + } + return (uchCRCHi << 8 | uchCRCLo); +} + +// Hoymiles CRC8 calculation with poly 0x01, Initial value 0x00 and final XOR 0x00 +uint8_t crc8(uint8_t *buf, const uint16_t bufLen) +{ + uint32_t crc; + uint16_t i, bit; + + crc = 0x00; + for (i = 0; i < bufLen; i++) + { + crc ^= buf[i]; + for (bit = 0; bit < 8; bit++) + { + if ((crc & 0x80) != 0) + { + crc <<= 1; + crc ^= 0x01; + } + else + { + crc <<= 1; + } + } + } + + return (crc & 0xFF); +} + +// NRF24 CRC16 calculation with poly 0x1021 = (1) 0001 0000 0010 0001 = x^16+x^12+x^5+1 +uint16_t crc16(uint8_t *buf, const uint16_t bufLen, const uint16_t startCRC, const uint16_t startBit, const uint16_t len_bits) +{ + uint16_t crc = startCRC; + if ((len_bits > 0) && (len_bits <= BYTES_TO_BITS(bufLen))) + { + // The length of the data might not be a multiple of full bytes. + // Therefore we proceed over the data bit-by-bit (like the NRF24 does) to + // calculate the CRC. + uint16_t data; + uint8_t byte, shift; + uint16_t bitoffs = startBit; + + // Get a new byte for the next 8 bits. + byte = buf[bitoffs >> 3]; +#ifdef OUTPUT_DEBUG_INFO + printf("\nStart CRC %04X, %u bits:", startCRC, len_bits); + printf("\nbyte %02X:", byte); +#endif + while (bitoffs < len_bits + startBit) + { + shift = bitoffs & 7; + // Shift the active bit to the position of bit 15 + data = ((uint16_t)byte) << (8 + shift); +#ifdef OUTPUT_DEBUG_INFO + printf(" bit %u %u,", shift, data & 0x8000 ? 1 : 0); +#endif + // Assure all other bits are 0 + data &= 0x8000; + crc ^= data; + if (crc & 0x8000) + { + crc = (crc << 1) ^ 0x1021; // 0x1021 = (1) 0001 0000 0010 0001 = x^16+x^12+x^5+1 + } + else + { + crc = (crc << 1); + } + ++bitoffs; + if (0 == (bitoffs & 7)) + { + // Get a new byte for the next 8 bits. + byte = buf[bitoffs >> 3]; +#ifdef OUTPUT_DEBUG_INFO + printf("crc %04X:", crc); + if (bitoffs < len_bits + startBit) + printf("\nbyte %02X:", byte); +#endif + } + } + } + return crc; +} \ No newline at end of file diff --git a/tools/NRF24_SendRcv/hm_crc.h b/tools/NRF24_SendRcv/hm_crc.h new file mode 100644 index 00000000..7f3c32e3 --- /dev/null +++ b/tools/NRF24_SendRcv/hm_crc.h @@ -0,0 +1,8 @@ + + +#define BITS_TO_BYTES(x) (((x)+7)>>3) +#define BYTES_TO_BITS(x) ((x)<<3) + +extern uint16_t crc16_modbus(uint8_t *puchMsg, uint16_t usDataLen); +extern uint8_t crc8(uint8_t *buf, const uint16_t bufLen); +extern uint16_t crc16(uint8_t* buf, const uint16_t bufLen, const uint16_t startCRC, const uint16_t startBit, const uint16_t len_bits); \ No newline at end of file diff --git a/tools/NRF24_SendRcv/hm_packets.cpp b/tools/NRF24_SendRcv/hm_packets.cpp new file mode 100644 index 00000000..7b09df61 --- /dev/null +++ b/tools/NRF24_SendRcv/hm_packets.cpp @@ -0,0 +1,74 @@ +#include "Arduino.h" + +#include "hm_crc.h" +#include "hm_packets.h" + +void HM_Packets::SetUnixTimeStamp(uint32_t ts) +{ + unixTimeStamp = ts; +} + +void HM_Packets::UnixTimeStampTick() +{ + unixTimeStamp++; +} + +void HM_Packets::prepareBuffer(uint8_t *buf) +{ + // minimal buffer size of 32 bytes is assumed + memset(buf, 0x00, 32); +} + +void HM_Packets::copyToBuffer(uint8_t *buf, uint32_t val) +{ + buf[0]= (uint8_t)(val >> 24); + buf[1]= (uint8_t)(val >> 16); + buf[2]= (uint8_t)(val >> 8); + buf[3]= (uint8_t)(val & 0xFF); +} + +void HM_Packets::copyToBufferBE(uint8_t *buf, uint32_t val) +{ + memcpy(buf, &val, sizeof(uint32_t)); +} + + +int32_t HM_Packets::GetTimePacket(uint8_t *buf, uint32_t wrAdr, uint32_t dtuAdr) +{ + prepareBuffer(buf); + + buf[0] = 0x15; + copyToBufferBE(&buf[1], wrAdr); + copyToBufferBE(&buf[5], dtuAdr); + buf[9] = 0x80; + + buf[10] = 0x0B; // cid + buf[11] = 0x00; + + copyToBuffer(&buf[12], unixTimeStamp); + + buf[19] = 0x05; + + // CRC16 + uint16_t crc16 = crc16_modbus(&buf[10], 14); + buf[24] = crc16 >> 8; + buf[25] = crc16 & 0xFF; + + // crc8 + buf[26] = crc8(&buf[0], 26); + + return 27; +} + +int32_t HM_Packets::GetCmdPacket(uint8_t *buf, uint32_t wrAdr, uint32_t dtuAdr, uint8_t mid, uint8_t cmd) +{ + buf[0] = mid; + copyToBufferBE(&buf[1], wrAdr); + copyToBufferBE(&buf[5], dtuAdr); + buf[9] = cmd; + + // crc8 + buf[10] = crc8(&buf[0], 10); + + return 11; +} diff --git a/tools/NRF24_SendRcv/hm_packets.h b/tools/NRF24_SendRcv/hm_packets.h new file mode 100644 index 00000000..1c8aca45 --- /dev/null +++ b/tools/NRF24_SendRcv/hm_packets.h @@ -0,0 +1,18 @@ + + +class HM_Packets +{ +private: + uint32_t unixTimeStamp; + + void prepareBuffer(uint8_t *buf); + void copyToBuffer(uint8_t *buf, uint32_t val); + void copyToBufferBE(uint8_t *buf, uint32_t val); + +public: + void SetUnixTimeStamp(uint32_t ts); + void UnixTimeStampTick(); + + int32_t GetTimePacket(uint8_t *buf, uint32_t wrAdr, uint32_t dtuAdr); + int32_t GetCmdPacket(uint8_t *buf, uint32_t wrAdr, uint32_t dtuAdr, uint8_t mid, uint8_t cmd); +}; diff --git a/tools/NRF24_SendRcv/wifi.h b/tools/NRF24_SendRcv/wifi.h new file mode 100644 index 00000000..d98cc40f --- /dev/null +++ b/tools/NRF24_SendRcv/wifi.h @@ -0,0 +1,345 @@ +#ifndef __WIFI_H +#define __WIFI_H + +#include "Settings.h" +#include "Debug.h" +#include +#include // von url=https://www.technologytourist.com + +String SSID = ""; // bestes WLan + +// Prototypes +time_t getNow (); +boolean setupWifi (); +boolean checkWifi(); + + +String findWifi () { +//---------------- + String ssid; + int32_t rssi; + uint8_t encryptionType; + uint8_t* bssid; + int32_t channel; + bool hidden; + int scanResult; + + String best_ssid = ""; + int32_t best_rssi = -100; + + DEBUG_OUT.println(F("Starting WiFi scan...")); + + scanResult = WiFi.scanNetworks(/*async=*/false, /*hidden=*/true); + + if (scanResult == 0) { + DEBUG_OUT.println(F("keine WLans")); + } else if (scanResult > 0) { + DEBUG_OUT.printf(PSTR("%d WLans gefunden:\n"), scanResult); + + // Print unsorted scan results + for (int8_t i = 0; i < scanResult; i++) { + WiFi.getNetworkInfo(i, ssid, encryptionType, rssi, bssid, channel, hidden); + + DEBUG_OUT.printf(PSTR(" %02d: [CH %02d] [%02X:%02X:%02X:%02X:%02X:%02X] %ddBm %c %c %s\n"), + i, + channel, + bssid[0], bssid[1], bssid[2], + bssid[3], bssid[4], bssid[5], + rssi, + (encryptionType == ENC_TYPE_NONE) ? ' ' : '*', + hidden ? 'H' : 'V', + ssid.c_str()); + delay(1); + boolean check; + #ifdef SSID_PREFIX1 + check = ssid.substring(0,strlen(SSID_PREFIX1)).equals(SSID_PREFIX1); + #else + check = true; + #endif + #ifdef SSID_PREFIX2 + check = check || ssid.substring(0,strlen(SSID_PREFIX2)).equals(SSID_PREFIX2); + #endif + if (check) { + if (rssi > best_rssi) { + best_rssi = rssi; + best_ssid = ssid; + } + } + } + } else { + DEBUG_OUT.printf(PSTR("WiFi scan error %d"), scanResult); + } + + if (! best_ssid.equals("")) { + SSID = best_ssid; + DEBUG_OUT.printf ("Bestes Wifi unter: %s\n", SSID.c_str()); + return SSID; + } + else + return ""; +} + +void IP2string (IPAddress IP, char * buf) { + sprintf (buf, "%d.%d.%d.%d", IP[0], IP[1], IP[2], IP[3]); +} + +void connectWifi() { +//------------------ +// if (SSID.equals("")) + String s = findWifi(); + + if (!SSID.equals("")) { + DEBUG_OUT.print("versuche zu verbinden mit "); DEBUG_OUT.println(SSID); + //while (WiFi.status() != WL_CONNECTED) { + WiFi.begin (SSID, SSID_PASSWORD); + int versuche = 20; + while (WiFi.status() != WL_CONNECTED && versuche > 0) { + delay(1000); + versuche--; + DEBUG_OUT.print(versuche); DEBUG_OUT.print(' '); + } + //} + if (WiFi.status() == WL_CONNECTED) { + char buffer[30]; + IP2string (WiFi.localIP(), buffer); + String out = "\n[WiFi]Verbunden; meine IP:" + String (buffer); + DEBUG_OUT.println (out); + } + else + DEBUG_OUT.print("\nkeine Verbindung mit SSID "); DEBUG_OUT.println(SSID); + } +} + + +boolean setupWifi () { +//------------------ + int count=5; + while (count-- && WiFi.status() != WL_CONNECTED) + connectWifi(); + return (WiFi.status() == WL_CONNECTED); +} + + +Pinger pinger; +IPAddress ROUTER = IPAddress(192,168,1,1); + +boolean checkWifi() { +//--------------- + boolean NotConnected = (WiFi.status() != WL_CONNECTED) || !pinger.Ping(ROUTER); + if (NotConnected) { + setupWifi(); + if (WiFi.status() == WL_CONNECTED) + getNow(); + } + return (WiFi.status() == WL_CONNECTED); +} + + + +// ################ Clock ################# + +#include +#include + +IPAddress timeServer; +unsigned int localPort = 8888; +const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message +byte packetBuf[NTP_PACKET_SIZE]; // Buffer to hold incoming and outgoing packets +const int timeZone = 1; // Central European Time = +1 +long SYNCINTERVALL = 0; +WiFiUDP Udp; // A UDP instance to let us send and receive packets over UDP + +// prototypes +time_t getNtpTime (); +void sendNTPpacket (IPAddress &address); +time_t getNow (); +char* getDateTimeStr (time_t no = getNow()); +time_t offsetDayLightSaving (uint32_t local_t); +bool isDayofDaylightChange (time_t local_t); + + +void _setSyncInterval (long intervall) { +//---------------------------------------- + SYNCINTERVALL = intervall; + setSyncInterval (intervall); +} + +void setupClock() { +//----------------- + WiFi.hostByName (TIMESERVER_NAME,timeServer); // at this point the function works + + Udp.begin(localPort); + + getNtpTime(); + + setSyncProvider (getNtpTime); + while(timeStatus()== timeNotSet) + delay(1); // + + _setSyncInterval (SECS_PER_DAY / 2); // Set seconds between re-sync + + //lastClock = now(); + //Serial.print("[NTP] get time from NTP server "); + getNow(); + //char buf[20]; + DEBUG_OUT.print ("[NTP] get time from NTP server "); + DEBUG_OUT.print (timeServer); + //sprintf (buf, ": %02d:%02d:%02d", hour(no), minute(no), second(no)); + DEBUG_OUT.print (": got "); + DEBUG_OUT.println (getDateTimeStr()); +} + +//*-------- NTP code ----------*/ + + +time_t getNtpTime() { +//------------------- + sendNTPpacket(timeServer); // send an NTP packet to a time server + //uint32_t beginWait = millis(); + //while (millis() - beginWait < 1500) { + int versuch = 0; + while (versuch < 5) { + int wait = 150; // results in max 1500 ms waitTime + while (wait--) { + int size = Udp.parsePacket(); + if (size >= NTP_PACKET_SIZE) { + //Serial.println("Receive NTP Response"); + Udp.read(packetBuf, NTP_PACKET_SIZE); // read packet into the buffer + unsigned long secsSince1900; + // convert four bytes starting at location 40 to a long integer + secsSince1900 = (unsigned long)packetBuf[40] << 24; + secsSince1900 |= (unsigned long)packetBuf[41] << 16; + secsSince1900 |= (unsigned long)packetBuf[42] << 8; + secsSince1900 |= (unsigned long)packetBuf[43]; + // time_t now = secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR; + + time_t utc = secsSince1900 - 2208988800UL; + time_t now = utc + (timeZone +offsetDayLightSaving(utc)) * SECS_PER_HOUR; + + if (isDayofDaylightChange (utc) && hour(utc) <= 4) + _setSyncInterval (SECS_PER_HOUR); + else + _setSyncInterval (SECS_PER_DAY / 2); + + return now; + } + else + delay(10); + } + versuch++; + } + return 0; +} + +// send an NTP request to the time server at the given address +void sendNTPpacket(IPAddress& address) { +//------------------------------------ + memset(packetBuf, 0, NTP_PACKET_SIZE); // set all bytes in the buffer to 0 + // Initialize values needed to form NTP request + packetBuf[0] = B11100011; // LI, Version, Mode + packetBuf[1] = 0; // Stratum + packetBuf[2] = 6; // Max Interval between messages in seconds + packetBuf[3] = 0xEC; // Clock Precision + // bytes 4 - 11 are for Root Delay and Dispersion and were set to 0 by memset + packetBuf[12] = 49; // four-byte reference ID identifying + packetBuf[13] = 0x4E; + packetBuf[14] = 49; + packetBuf[15] = 52; + // send the packet requesting a timestamp: + Udp.beginPacket(address, 123); //NTP requests are to port 123 + Udp.write(packetBuf,NTP_PACKET_SIZE); + Udp.endPacket(); + +} + +int getTimeTrials = 0; + +bool isValidDateTime (time_t no) { + return (year(no) > 2020 && year(no) < 2038); +} + +bool isDayofDaylightChange (time_t local_t) { +//----------------------------------------- + int jahr = year (local_t); + int monat = month (local_t); + int tag = day (local_t); + bool ret = ( (monat ==3 && tag == (31 - (5 * jahr /4 + 4) % 7)) || + (monat==10 && tag == (31 - (5 * jahr /4 + 1) % 7))); + DEBUG_OUT.print ("isDayofDaylightChange="); DEBUG_OUT.println (ret); + return ret; +} + +// calculates the daylight saving time for middle Europe. Input: Unixtime in UTC (!) +// übernommen von Jurs, see : https://forum.arduino.cc/index.php?topic=172044.msg1278536#msg1278536 +time_t offsetDayLightSaving (uint32_t local_t) { +//-------------------------------------------- + int monat = month (local_t); + if (monat < 3 || monat > 10) return 0; // no DSL in Jan, Feb, Nov, Dez + if (monat > 3 && monat < 10) return 1; // DSL in Apr, May, Jun, Jul, Aug, Sep + int jahr = year (local_t); + int std = hour (local_t); + //int tag = day (local_t); + int stundenBisHeute = (std + 24 * day(local_t)); + if ( (monat == 3 && stundenBisHeute >= (1 + timeZone + 24 * (31 - (5 * jahr /4 + 4) % 7))) || + (monat == 10 && stundenBisHeute < (1 + timeZone + 24 * (31 - (5 * jahr /4 + 1) % 7))) ) + return 1; + else + return 0; + /* + int stundenBisWechsel = (1 + 24 * (31 - (5 * year(local_t) / 4 + 4) % 7)); + if (monat == 3 && stundenBisHeute >= stundenBisWechsel || monat == 10 && stundenBisHeute < stundenBisWechsel) + return 1; + else + return 0; + */ +} + + +time_t getNow () { +//--------------- + time_t jetzt = now(); + while (!isValidDateTime(jetzt) && getTimeTrials < 10) { // ungültig, max 10x probieren + if (getTimeTrials) { + //Serial.print (getTimeTrials); + //Serial.println(". Versuch für getNtpTime"); + } + jetzt = getNtpTime (); + if (isValidDateTime(jetzt)) { + setTime (jetzt); + getTimeTrials = 0; + } + else + getTimeTrials++; + } + //return jetzt + offsetDayLightSaving(jetzt)*SECS_PER_HOUR; + return jetzt; +} + + +char _timestr[24]; + +char* getNowStr (time_t no = getNow()) { +//------------------------------------ + sprintf (_timestr, "%02d:%02d:%02d", hour(no), minute(no), second(no)); + return _timestr; +} + +char* getTimeStr (time_t no = getNow()) { +//------------------------------------ + return getNowStr (no); +} + +char* getDateTimeStr (time_t no) { +//------------------------------ + sprintf (_timestr, "%04d-%02d-%02d+%02d:%02d:%02d", year(no), month(no), day(no), hour(no), minute(no), second(no)); + return _timestr; +} + +char* getDateStr (time_t no) { +//------------------------------ + sprintf (_timestr, "%04d-%02d-%02d", year(no), month(no), day(no)); + return _timestr; +} + + +#endif diff --git a/tools/esp8266/CircularBuffer.h b/tools/esp8266/CircularBuffer.h index ab29e96a..8ad3d5df 100644 --- a/tools/esp8266/CircularBuffer.h +++ b/tools/esp8266/CircularBuffer.h @@ -1,21 +1,21 @@ /* - CircularBuffer - An Arduino circular buffering library for arbitrary types. - - Created by Ivo Pullens, Emmission, 2014 -- www.emmission.nl - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + CircularBuffer - An Arduino circular buffering library for arbitrary types. + + Created by Ivo Pullens, Emmission, 2014 -- www.emmission.nl + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef CircularBuffer_h @@ -26,133 +26,136 @@ #define RESTORE_IRQ interrupts() #else #define DISABLE_IRQ \ - uint8_t sreg = SREG; \ - cli(); + uint8_t sreg = SREG; \ + cli(); #define RESTORE_IRQ \ - SREG = sreg; + SREG = sreg; #endif -template class CircularBuffer -{ - public: - /** Constructor - * @param buffer Preallocated buffer of at least size records. - * @param size Number of records available in the buffer. - */ - CircularBuffer(T* buffer, const uint8_t size ) - : m_size(size), m_buff(buffer) - { - clear(); - } - - /** Clear all entries in the circular buffer. */ - void clear(void) - { - m_front = 0; - m_fill = 0; - } - - /** Test if the circular buffer is empty */ - inline bool empty(void) const - { - return !m_fill; - } - - /** Return the number of records stored in the buffer */ - inline uint8_t available(void) const - { - return m_fill; - } - - /** Test if the circular buffer is full */ - inline bool full(void) const - { - return m_fill == m_size; - } - - /** Aquire record on front of the buffer, for writing. - * After filling the record, it has to be pushed to actually - * add it to the buffer. - * @return Pointer to record, or NULL when buffer is full. - */ - T* getFront(void) const - { - DISABLE_IRQ; - T* f = NULL; - if (!full()) - f = get(m_front); - RESTORE_IRQ; - return f; - } - - /** Push record to front of the buffer - * @param record Record to push. If record was aquired previously (using getFront) its - * data will not be copied as it is already present in the buffer. - * @return True, when record was pushed successfully. - */ - bool pushFront(T* record) - { - bool ok = false; - DISABLE_IRQ; - if (!full()) - { - T* f = get(m_front); - if (f != record) - *f = *record; - m_front = (m_front+1) % m_size; - m_fill++; - ok = true; - } - RESTORE_IRQ; - return ok; - } - - /** Aquire record on back of the buffer, for reading. - * After reading the record, it has to be pop'ed to actually - * remove it from the buffer. - * @return Pointer to record, or NULL when buffer is empty. - */ - T* getBack(void) const - { - T* b = NULL; - DISABLE_IRQ; - if (!empty()) - b = get(back()); - RESTORE_IRQ; - return b; - } - - /** Remove record from back of the buffer. - * @return True, when record was pop'ed successfully. - */ - bool popBack(void) - { - bool ok = false; - DISABLE_IRQ; - if (!empty()) - { - m_fill--; - ok = true; - } - RESTORE_IRQ; - return ok; - } - - protected: - inline T * get(const uint8_t idx) const - { - return &(m_buff[idx]); - } - inline uint8_t back(void) const - { - return (m_front - m_fill + m_size) % m_size; - } - - const uint8_t m_size; // Total number of records that can be stored in the buffer. - T* const m_buff; // Ptr to buffer holding all records. - volatile uint8_t m_front; // Index of front element (not pushed yet). - volatile uint8_t m_fill; // Amount of records currently pushed. +template +class CircularBuffer { + + typedef BUFFERTYPE BufferType; + BufferType Buffer[BUFFERSIZE]; + + public: + CircularBuffer() : m_buff(Buffer) { + m_size = BUFFERSIZE; + clear(); + } + + /** Clear all entries in the circular buffer. */ + void clear(void) + { + m_front = 0; + m_fill = 0; + } + + /** Test if the circular buffer is empty */ + inline bool empty(void) const + { + return !m_fill; + } + + /** Return the number of records stored in the buffer */ + inline uint8_t available(void) const + { + return m_fill; + } + + /** Test if the circular buffer is full */ + inline bool full(void) const + { + return m_fill == m_size; + } + + inline uint8_t getFill(void) const { + return m_fill; + } + + /** Aquire record on front of the buffer, for writing. + * After filling the record, it has to be pushed to actually + * add it to the buffer. + * @return Pointer to record, or NULL when buffer is full. + */ + BUFFERTYPE* getFront(void) const + { + DISABLE_IRQ; + BUFFERTYPE* f = NULL; + if (!full()) + f = get(m_front); + RESTORE_IRQ; + return f; + } + + /** Push record to front of the buffer + * @param record Record to push. If record was aquired previously (using getFront) its + * data will not be copied as it is already present in the buffer. + * @return True, when record was pushed successfully. + */ + bool pushFront(BUFFERTYPE* record) + { + bool ok = false; + DISABLE_IRQ; + if (!full()) + { + BUFFERTYPE* f = get(m_front); + if (f != record) + *f = *record; + m_front = (m_front+1) % m_size; + m_fill++; + ok = true; + } + RESTORE_IRQ; + return ok; + } + + /** Aquire record on back of the buffer, for reading. + * After reading the record, it has to be pop'ed to actually + * remove it from the buffer. + * @return Pointer to record, or NULL when buffer is empty. + */ + BUFFERTYPE* getBack(void) const + { + BUFFERTYPE* b = NULL; + DISABLE_IRQ; + if (!empty()) + b = get(back()); + RESTORE_IRQ; + return b; + } + + /** Remove record from back of the buffer. + * @return True, when record was pop'ed successfully. + */ + bool popBack(void) + { + bool ok = false; + DISABLE_IRQ; + if (!empty()) + { + m_fill--; + ok = true; + } + RESTORE_IRQ; + return ok; + } + + protected: + inline BUFFERTYPE * get(const uint8_t idx) const + { + return &(m_buff[idx]); + } + inline uint8_t back(void) const + { + return (m_front - m_fill + m_size) % m_size; + } + + uint8_t m_size; // Total number of records that can be stored in the buffer. + BUFFERTYPE* const m_buff; + volatile uint8_t m_front; // Index of front element (not pushed yet). + volatile uint8_t m_fill; // Amount of records currently pushed. }; #endif // CircularBuffer_h diff --git a/tools/esp8266/README.md b/tools/esp8266/README.md index f8690dec..cdb120cd 100644 --- a/tools/esp8266/README.md +++ b/tools/esp8266/README.md @@ -1,12 +1,9 @@ ## OVERVIEW -This code was tested on a ESP8266 - ESP-07 module. Many parts of the code are based on 'Hubi's code, which can be found here: +This code is intended to run on a Wemos D1mini or similar. The code is based on 'Hubi's code, which can be found here: -The NRF24L01+ radio module is connected to the standard SPI pins. Additional there are 3 pins, which can be set individual: - -- IRQ - Pin 4 -- CE - Pin 5 -- CS - Pin 15 +The NRF24L01+ radio module is connected to the standard SPI pins. Additional there are 3 pins, which can be set individual: CS, CE and IRQ +These pins can be changed from the /setup URL ## Compile @@ -16,6 +13,13 @@ This code can be compiled using Arduino. The settings were: - Board: Generic ESP8266 Module - Flash-Size: 1MB (FS: none, OTA: 502kB) +### Optional Configuration before compilation + +- number of supported inverters (set to 3 by default) `defines.h` +- enable channel hopping `hmRadio.h` +- DTU radio id `hmRadio.h` +- unformated list in webbrowser `/livedata` `defines.h`, `LIVEDATA_VISUALIZED` + ## Flash ESP with firmware @@ -24,22 +28,33 @@ This code can be compiled using Arduino. The settings were: 3. the ESP will start as access point (AP) if there is no network config stored in its eeprom 4. connect to the AP, you will be forwarded to the setup page 5. configure your WiFi settings, save, repower -6. check your router for the IP address of the module +6. check your router or serial console for the IP address of the module. You can try ping the configured device name as well. ## Usage -Connect the ESP to power and to your serial console. The webinterface is currently only used for OTA and config. -The serial console will print all information which is send and received. +Connect the ESP to power and to your serial console (optional). The webinterface has the following abilities: + +- OTA Update (over the air update) +- Configuration (Wifi, inverter(s), Pinout, MQTT) +- visual display of the connected inverters / modules +- some statistics about communication (debug) + +The serial console will print the converted values which were read out of the inverter(s) -## Known Issues +## Compatiblity -- only command 0x81 is received +For now the following inverters should work out of the box: +- HM400 +- HM600 +- HM800 +- HM1200 ## USED LIBRARIES - `Time` - `RF24` +- `PubSubClient` diff --git a/tools/esp8266/app.cpp b/tools/esp8266/app.cpp index 0b6db0a0..7eee08bf 100644 --- a/tools/esp8266/app.cpp +++ b/tools/esp8266/app.cpp @@ -1,20 +1,31 @@ #include "app.h" #include "html/h/index_html.h" -extern String setup_html; +#include "html/h/setup_html.h" +#include "html/h/hoymiles_html.h" + //----------------------------------------------------------------------------- app::app() : Main() { - mHoymiles = new hoymiles(); + mSendTicker = 0xffff; + mSendInterval = 0; + mMqttTicker = 0xffff; + mMqttInterval = 0; + mSerialTicker = 0xffff; + mSerialInterval = 0; + mMqttActive = false; + + mTicker = 0; + mRxTicker = 0; - mBufCtrl = new CircularBuffer(mBuffer, PACKET_BUFFER_SIZE); + mShowRebootRequest = false; - mSendCnt = 0; - mSendTicker = new Ticker(); - mFlagSend = false; + mSerialValues = true; + mSerialDebug = false; - memset(mCmds, 0, sizeof(uint32_t)); - memset(mChannelStat, 0, sizeof(uint32_t)); + memset(mPacketIds, 0, sizeof(uint32_t)*DBG_CMD_LIST_LEN); + + mSys = new HmSystemType(); } @@ -25,26 +36,96 @@ app::~app(void) { //----------------------------------------------------------------------------- -void app::setup(const char *ssid, const char *pwd, uint32_t timeout) { - Main::setup(ssid, pwd, timeout); - - mWeb->on("/", std::bind(&app::showIndex, this)); - mWeb->on("/setup", std::bind(&app::showSetup, this)); - mWeb->on("/save", std::bind(&app::showSave, this)); - mWeb->on("/cmdstat", std::bind(&app::showCmdStatistics, this)); - - if(mSettingsValid) - mEep->read(ADDR_HOY_ADDR, mHoymiles->mAddrBytes, HOY_ADDR_LEN); - else - memset(mHoymiles->mAddrBytes, 0, 6); - mHoymiles->serial2RadioId(); +void app::setup(uint32_t timeout) { + Main::setup(timeout); + + mWeb->on("/", std::bind(&app::showIndex, this)); + mWeb->on("/setup", std::bind(&app::showSetup, this)); + mWeb->on("/save", std::bind(&app::showSave, this)); + mWeb->on("/erase", std::bind(&app::showErase, this)); + mWeb->on("/cmdstat", std::bind(&app::showStatistics, this)); + mWeb->on("/hoymiles", std::bind(&app::showHoymiles, this)); + mWeb->on("/livedata", std::bind(&app::showLiveData, this)); + + if(mSettingsValid) { + uint64_t invSerial; + char invName[MAX_NAME_LENGTH + 1] = {0}; + uint8_t invType; + + // inverter + for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i ++) { + mEep->read(ADDR_INV_ADDR + (i * 8), &invSerial); + mEep->read(ADDR_INV_NAME + (i * MAX_NAME_LENGTH), invName, MAX_NAME_LENGTH); + mEep->read(ADDR_INV_TYPE + i, &invType); + if(0ULL != invSerial) { + mSys->addInverter(invName, invSerial, invType); + DPRINTLN("add inverter: " + String(invName) + ", SN: " + String(invSerial, HEX) + ", type: " + String(invType)); + } + } + mEep->read(ADDR_INV_INTERVAL, &mSendInterval); + if(mSendInterval < 5) + mSendInterval = 5; + + // pinout + mEep->read(ADDR_PINOUT, &mSys->Radio.pinCs); + mEep->read(ADDR_PINOUT+1, &mSys->Radio.pinCe); + mEep->read(ADDR_PINOUT+2, &mSys->Radio.pinIrq); + + + // nrf24 amplifier power + mEep->read(ADDR_RF24_AMP_PWR, &mSys->Radio.AmplifierPower); + + // serial console + uint8_t tmp; + mEep->read(ADDR_SER_INTERVAL, &mSerialInterval); + mEep->read(ADDR_SER_ENABLE, &tmp); + mSerialValues = (tmp == 0x01); + mEep->read(ADDR_SER_DEBUG, &tmp); + mSerialDebug = (tmp == 0x01); + if(mSerialInterval < 1) + mSerialInterval = 1; + + + // mqtt + uint8_t mqttAddr[MQTT_ADDR_LEN]; + uint16_t mqttPort; + char mqttUser[MQTT_USER_LEN]; + char mqttPwd[MQTT_PWD_LEN]; + char mqttTopic[MQTT_TOPIC_LEN]; + mEep->read(ADDR_MQTT_ADDR, mqttAddr, MQTT_ADDR_LEN); + mEep->read(ADDR_MQTT_USER, mqttUser, MQTT_USER_LEN); + mEep->read(ADDR_MQTT_PWD, mqttPwd, MQTT_PWD_LEN); + mEep->read(ADDR_MQTT_TOPIC, mqttTopic, MQTT_TOPIC_LEN); + mEep->read(ADDR_MQTT_INTERVAL, &mMqttInterval); + mEep->read(ADDR_MQTT_PORT, &mqttPort); + + char addr[16] = {0}; + sprintf(addr, "%d.%d.%d.%d", mqttAddr[0], mqttAddr[1], mqttAddr[2], mqttAddr[3]); + mMqttActive = (mqttAddr[0] > 0); + + + if(mMqttInterval < 1) + mMqttInterval = 1; + mMqtt.setup(addr, mqttTopic, mqttUser, mqttPwd, mqttPort); + mMqttTicker = 0; + + mSerialTicker = 0; + + mMqtt.sendMsg("version", mVersion); + } - initRadio(); + mSys->setup(); - if(mSettingsValid) - mSendTicker->attach_ms(1000, std::bind(&app::sendTicker, this)); - else - Serial.println("Warn: your settings are not valid! check [IP]/setup"); + if(!mWifiSettingsValid) + DPRINTLN("Warn: your settings are not valid! check [IP]/setup"); + else { + DPRINTLN("\n\n----------------------------------------"); + DPRINTLN("Welcome to AHOY!"); + DPRINT("\npoint your browser to http://"); + DPRINTLN(WiFi.localIP()); + DPRINTLN("to configure your device"); + DPRINTLN("----------------------------------------\n"); + } } @@ -52,219 +133,371 @@ void app::setup(const char *ssid, const char *pwd, uint32_t timeout) { void app::loop(void) { Main::loop(); - if(!mBufCtrl->empty()) { - uint8_t len, rptCnt; - NRF24_packet_t *p = mBufCtrl->getBack(); - - //mHoymiles->dumpBuf("RAW ", p->packet, PACKET_BUFFER_SIZE); - - if(mHoymiles->checkCrc(p->packet, &len, &rptCnt)) { - // process buffer only on first occurrence - if((0 != len) && (0 == rptCnt)) { - Serial.println("CMD " + String(p->packet[11], HEX)); - mHoymiles->dumpBuf("Payload ", p->packet, len); - // @TODO: do analysis here - if(p->packet[11] == 0x01) mCmds[0]++; - else if(p->packet[11] == 0x02) mCmds[1]++; - else if(p->packet[11] == 0x03) mCmds[2]++; - else if(p->packet[11] == 0x81) mCmds[3]++; - else if(p->packet[11] == 0x84) mCmds[4]++; - else mCmds[5]++; - - if(p->sendCh == 23) mChannelStat[0]++; - else if(p->sendCh == 40) mChannelStat[1]++; - else if(p->sendCh == 61) mChannelStat[2]++; - else mChannelStat[3]++; + if(checkTicker(&mRxTicker, 5)) { + mSys->Radio.switchRxCh(); + if(!mSys->BufCtrl.empty()) { + uint8_t len, rptCnt; + packet_t *p = mSys->BufCtrl.getBack(); + + //if(mSerialDebug) + // mSys->Radio.dumpBuf("RAW ", p->packet, MAX_RF_PAYLOAD_SIZE); + + if(mSys->Radio.checkPaketCrc(p->packet, &len, &rptCnt, p->rxCh)) { + // process buffer only on first occurrence + if((0 != len) && (0 == rptCnt)) { + uint8_t *packetId = &p->packet[9]; + //DPRINTLN("CMD " + String(*packetId, HEX)); + if(mSerialDebug) + mSys->Radio.dumpBuf("Payload ", p->packet, len); + + Inverter<> *iv = mSys->findInverter(&p->packet[1]); + if(NULL != iv) { + for(uint8_t i = 0; i < iv->listLen; i++) { + if(iv->assign[i].cmdId == *packetId) + iv->addValue(i, &p->packet[9]); + } + iv->doCalculations(); + //memcpy(mPayload[(*packetId & 0x7F) - 1], &p->packet[9], MAX_RF_PAYLOAD_SIZE - 11); + } + + if(*packetId == 0x01) mPacketIds[0]++; + else if(*packetId == 0x02) mPacketIds[1]++; + else if(*packetId == 0x03) mPacketIds[2]++; + else if(*packetId == 0x81) mPacketIds[3]++; + else if(*packetId == 0x82) mPacketIds[4]++; + else if(*packetId == 0x83) mPacketIds[5]++; + else if(*packetId == 0x84) mPacketIds[6]++; + else mPacketIds[7]++; + } } + mSys->BufCtrl.popBack(); } - mBufCtrl->popBack(); - } - - if(mFlagSend) { - mFlagSend = false; - - uint8_t size = 0; - if((mSendCnt % 6) == 0) - size = mHoymiles->getTimePacket(mSendBuf, mTimestamp); - else if((mSendCnt % 6) == 1) - size = mHoymiles->getCmdPacket(mSendBuf, 0x15, 0x81); - else if((mSendCnt % 6) == 2) - size = mHoymiles->getCmdPacket(mSendBuf, 0x15, 0x80); - else if((mSendCnt % 6) == 3) - size = mHoymiles->getCmdPacket(mSendBuf, 0x15, 0x83); - else if((mSendCnt % 6) == 4) - size = mHoymiles->getCmdPacket(mSendBuf, 0x15, 0x82); - else if((mSendCnt % 6) == 5) - size = mHoymiles->getCmdPacket(mSendBuf, 0x15, 0x84); - - //Serial.println("sent packet: #" + String(mSendCnt)); - //dumpBuf(mSendBuf, size); - sendPacket(mSendBuf, size); - - mSendCnt++; } -} + if(checkTicker(&mTicker, 1000)) { + if(mMqttActive) { + mMqtt.loop(); + if(++mMqttTicker >= mMqttInterval) { + mMqttTicker = 0; + mMqtt.isConnected(true); + char topic[30], val[10]; + for(uint8_t id = 0; id < mSys->getNumInverters(); id++) { + Inverter<> *iv = mSys->getInverterByPos(id); + if(NULL != iv) { + for(uint8_t i = 0; i < iv->listLen; i++) { + if(0.0f != iv->getValue(i)) { + snprintf(topic, 30, "%s/ch%d/%s", iv->name, iv->assign[i].ch, fields[iv->assign[i].fieldId]); + snprintf(val, 10, "%.3f", iv->getValue(i)); + mMqtt.sendMsg(topic, val); + yield(); + } + } + } + } + } + } -//----------------------------------------------------------------------------- -void app::handleIntr(void) { - uint8_t lostCnt = 0, pipe, len; - NRF24_packet_t *p; - - DISABLE_IRQ; - - while(mRadio->available(&pipe)) { - if(!mBufCtrl->full()) { - p = mBufCtrl->getFront(); - memset(p->packet, 0xcc, MAX_RF_PAYLOAD_SIZE); - p->sendCh = mSendChannel; - len = mRadio->getPayloadSize(); - if(len > MAX_RF_PAYLOAD_SIZE) - len = MAX_RF_PAYLOAD_SIZE; - - mRadio->read(p->packet, len); - mBufCtrl->pushFront(p); - lostCnt = 0; + if(mSerialValues) { + if(++mSerialTicker >= mSerialInterval) { + mSerialTicker = 0; + char topic[30], val[10]; + for(uint8_t id = 0; id < mSys->getNumInverters(); id++) { + Inverter<> *iv = mSys->getInverterByPos(id); + if(NULL != iv) { + for(uint8_t i = 0; i < iv->listLen; i++) { + if(0.0f != iv->getValue(i)) { + snprintf(topic, 30, "%s/ch%d/%s", iv->name, iv->assign[i].ch, iv->getFieldName(i)); + snprintf(val, 10, "%.3f %s", iv->getValue(i), iv->getUnit(i)); + DPRINTLN(String(topic) + ": " + String(val)); + } + yield(); + } + } + } + } } - else { - bool tx_ok, tx_fail, rx_ready; - if(lostCnt < 255) - lostCnt++; - mRadio->whatHappened(tx_ok, tx_fail, rx_ready); // reset interrupt status - mRadio->flush_rx(); // drop the packet + + if(++mSendTicker >= mSendInterval) { + mSendTicker = 0; + + if(!mSys->BufCtrl.empty()) + DPRINTLN("recbuf not empty! #" + String(mSys->BufCtrl.getFill())); + Inverter<> *inv; + for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i ++) { + inv = mSys->getInverterByPos(i); + if(NULL != inv) { + yield(); + mSys->Radio.sendTimePacket(inv->radioId.u64, mTimestamp); + mRxTicker = 0; + } + } } } - - RESTORE_IRQ; } //----------------------------------------------------------------------------- -void app::initRadio(void) { - mRadio = new RF24(RF24_CE_PIN, RF24_CS_PIN); - - mRadio->begin(); - mRadio->setAutoAck(false); - mRadio->setRetries(0, 0); - - mRadio->setChannel(DEFAULT_RECV_CHANNEL); - mRadio->setDataRate(RF24_250KBPS); - mRadio->disableCRC(); - mRadio->setAutoAck(false); - mRadio->setPayloadSize(MAX_RF_PAYLOAD_SIZE); - mRadio->setAddressWidth(5); - mRadio->openReadingPipe(1, DTU_RADIO_ID); - - // enable only receiving interrupts - mRadio->maskIRQ(true, true, false); - - // Use lo PA level, as a higher level will disturb CH340 serial usb adapter - mRadio->setPALevel(RF24_PA_MAX); - mRadio->startListening(); +void app::handleIntr(void) { + mSys->Radio.handleIntr(); +} - Serial.println("Radio Config:"); - mRadio->printPrettyDetails(); - mSendChannel = mHoymiles->getDefaultChannel(); +//----------------------------------------------------------------------------- +void app::showIndex(void) { + String html = FPSTR(index_html); + html.replace("{DEVICE}", mDeviceName); + html.replace("{VERSION}", mVersion); + mWeb->send(200, "text/html", html); } //----------------------------------------------------------------------------- -void app::sendPacket(uint8_t buf[], uint8_t len) { - DISABLE_IRQ; - mRadio->stopListening(); +void app::showSetup(void) { + // overrides same method in main.cpp + + uint16_t interval; -#ifdef CHANNEL_HOP - if(mSendCnt % 6 == 0) - mSendChannel = mHoymiles->getNxtChannel(); + String html = FPSTR(setup_html); + html.replace("{SSID}", mStationSsid); + // PWD will be left at the default value (for protection) + // -> the PWD will only be changed if it does not match the placeholder "{PWD}" + + html.replace("{DEVICE}", String(mDeviceName)); + html.replace("{VERSION}", String(mVersion)); + if(mApActive) + html.replace("{IP}", String("http://192.168.1.1")); else - mSendChannel = mHoymiles->getLastChannel(); -#else - mSendChannel = mHoymiles->getDefaultChannel(); -#endif - mRadio->setChannel(mSendChannel); - //Serial.println("CH: " + String(mSendChannel)); + html.replace("{IP}", ("http://" + String(WiFi.localIP().toString()))); + + String inv; + uint64_t invSerial; + char invName[MAX_NAME_LENGTH + 1] = {0}; + uint8_t invType; + for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i ++) { + mEep->read(ADDR_INV_ADDR + (i * 8), &invSerial); + mEep->read(ADDR_INV_NAME + (i * MAX_NAME_LENGTH), invName, MAX_NAME_LENGTH); + mEep->read(ADDR_INV_TYPE + i, &invType); + inv += "

Inverter "+ String(i) + "

"; + + inv += ""; + inv += ""; + + inv += ""; + inv += ""; + + inv += ""; + inv += ""; + } + html.replace("{INVERTERS}", String(inv)); + + + // pinout + String pinout; + for(uint8_t i = 0; i < 3; i++) { + pinout += ""; + pinout += ""; + } + html.replace("{PINOUT}", String(pinout)); - mRadio->openWritingPipe(mHoymiles->mRadioId); - mRadio->setCRCLength(RF24_CRC_16); - mRadio->enableDynamicPayloads(); - mRadio->setAutoAck(true); - mRadio->setRetries(3, 15); - mRadio->write(buf, len); + // nrf24l01+ + String rf24; + for(uint8_t i = 0; i <= 3; i++) { + rf24 += ""; + } + html.replace("{RF24}", String(rf24)); + + + if(mSettingsValid) { + mEep->read(ADDR_INV_INTERVAL, &interval); + html.replace("{INV_INTVL}", String(interval)); + + uint8_t tmp; + mEep->read(ADDR_SER_INTERVAL, &interval); + mEep->read(ADDR_SER_ENABLE, &tmp); + html.replace("{SER_INTVL}", String(interval)); + html.replace("{SER_VAL_CB}", (tmp == 0x01) ? "checked" : ""); + mEep->read(ADDR_SER_DEBUG, &tmp); + html.replace("{SER_DBG_CB}", (tmp == 0x01) ? "checked" : ""); + + uint8_t mqttAddr[MQTT_ADDR_LEN] = {0}; + uint16_t mqttPort; + mEep->read(ADDR_MQTT_ADDR, mqttAddr, MQTT_ADDR_LEN); + mEep->read(ADDR_MQTT_INTERVAL, &interval); + mEep->read(ADDR_MQTT_PORT, &mqttPort); + + char addr[16] = {0}; + sprintf(addr, "%d.%d.%d.%d", mqttAddr[0], mqttAddr[1], mqttAddr[2], mqttAddr[3]); + html.replace("{MQTT_ADDR}", String(addr)); + html.replace("{MQTT_PORT}", String(mqttPort)); + html.replace("{MQTT_USER}", String(mMqtt.getUser())); + html.replace("{MQTT_PWD}", String(mMqtt.getPwd())); + html.replace("{MQTT_TOPIC}", String(mMqtt.getTopic())); + html.replace("{MQTT_INTVL}", String(interval)); + } + else { + html.replace("{INV_INTVL}", "5"); - // Try to avoid zero payload acks (has no effect) - mRadio->openWritingPipe(DUMMY_RADIO_ID); // TODO: why dummy radio id? + html.replace("{SER_VAL_CB}", "checked"); + html.replace("{SER_DBG_CB}", ""); + html.replace("{SER_INTVL}", "10"); - mRadio->setAutoAck(false); - mRadio->setRetries(0, 0); - mRadio->disableDynamicPayloads(); - mRadio->setCRCLength(RF24_CRC_DISABLED); + html.replace("{MQTT_ADDR}", ""); + html.replace("{MQTT_PORT}", "1883"); + html.replace("{MQTT_USER}", ""); + html.replace("{MQTT_PWD}", ""); + html.replace("{MQTT_TOPIC}", "/inverter"); + html.replace("{MQTT_INTVL}", "10"); - mRadio->setChannel(DEFAULT_RECV_CHANNEL); - mRadio->startListening(); + html.replace("{SER_INTVL}", "10"); + } - RESTORE_IRQ; + mWeb->send(200, "text/html", html); } //----------------------------------------------------------------------------- -void app::sendTicker(void) { - mFlagSend = true; +void app::showSave(void) { + saveValues(true); } //----------------------------------------------------------------------------- -void app::showIndex(void) { - String html = index_html; - html.replace("{DEVICE}", mDeviceName); - html.replace("{VERSION}", mVersion); - mWeb->send(200, "text/html", html); +void app::showErase() { + eraseSettings(); + showReboot(); } //----------------------------------------------------------------------------- -void app::showSetup(void) { - // overrides same method in main.cpp +void app::showStatistics(void) { + String content = "Packets:\n"; + for(uint8_t i = 0; i < DBG_CMD_LIST_LEN; i ++) { + content += String("0x") + String(dbgCmds[i], HEX) + String(": ") + String(mPacketIds[i]) + String("\n"); + } + content += String("other: ") + String(mPacketIds[DBG_CMD_LIST_LEN]) + String("\n\n"); - String html = setup_html; - html.replace("{SSID}", mStationSsid); - // PWD will be left at the default value (for protection) - // -> the PWD will only be changed if it does not match the placeholder "{PWD}" + content += "Send Cnt: " + String(mSys->Radio.mSendCnt) + String("\n\n"); - char addr[20] = {0}; - sprintf(addr, "%02X:%02X:%02X:%02X:%02X:%02X", mHoymiles->mAddrBytes[0], mHoymiles->mAddrBytes[1], mHoymiles->mAddrBytes[2], mHoymiles->mAddrBytes[3], mHoymiles->mAddrBytes[4], mHoymiles->mAddrBytes[5]); - html.replace("{HOY_ADDR}", String(addr)); + if(!mSys->Radio.isChipConnected()) + content += "WARNING! your NRF24 module can't be reached, check the wiring and pinout (setup)\n"; - html.replace("{DEVICE}", String(mDeviceName)); - html.replace("{VERSION}", String(mVersion)); + if(mShowRebootRequest) + content += "INFO: reboot your ESP to apply all your configuration changes!\n"; - mWeb->send(200, "text/html", html); + if(!mSettingsValid) + content += "INFO: your settings are invalid, please switch to setup to correct this.\n"; + + content += "MQTT: "; + if(!mMqtt.isConnected()) + content += "not "; + content += "connected\n"; + + mWeb->send(200, "text/plain", content); } //----------------------------------------------------------------------------- -void app::showSave(void) { - saveValues(true); +void app::showHoymiles(void) { + String html = FPSTR(hoymiles_html); + html.replace("{DEVICE}", mDeviceName); + html.replace("{VERSION}", mVersion); + mWeb->send(200, "text/html", html); } //----------------------------------------------------------------------------- -void app::showCmdStatistics(void) { - String content = "CMDs:\n"; - content += String("0x01: ") + String(mCmds[0]) + String("\n"); - content += String("0x02: ") + String(mCmds[1]) + String("\n"); - content += String("0x03: ") + String(mCmds[2]) + String("\n"); - content += String("0x81: ") + String(mCmds[3]) + String("\n"); - content += String("0x84: ") + String(mCmds[4]) + String("\n"); - content += String("other: ") + String(mCmds[5]) + String("\n"); - - content += "\nCHANNELs:\n"; - content += String("23: ") + String(mChannelStat[0]) + String("\n"); - content += String("40: ") + String(mChannelStat[1]) + String("\n"); - content += String("61: ") + String(mChannelStat[2]) + String("\n"); - content += String("75: ") + String(mChannelStat[3]) + String("\n"); - mWeb->send(200, "text/plain", content); +void app::showLiveData(void) { + String modHtml; + for(uint8_t id = 0; id < mSys->getNumInverters(); id++) { + Inverter<> *iv = mSys->getInverterByPos(id); + if(NULL != iv) { +#ifdef LIVEDATA_VISUALIZED + uint8_t modNum, pos; + switch(iv->type) { + default: modNum = 1; break; + case INV_TYPE_HM600: + case INV_TYPE_HM800: modNum = 2; break; + case INV_TYPE_HM1200: modNum = 4; break; + } + + modHtml += "
"; + modHtml += "
" + String(iv->name) + ""; + uint8_t list[8] = {FLD_UAC, FLD_IAC, FLD_PAC, FLD_F, FLD_PCT, FLD_T, FLD_YT, FLD_YD}; + + for(uint8_t fld = 0; fld < 8; fld++) { + pos = (iv->getPosByChFld(CH0, list[fld])); + if(0xff != pos) { + modHtml += "
"; + modHtml += "" + String(iv->getValue(pos)); + modHtml += "" + String(iv->getUnit(pos)) + ""; + modHtml += "" + String(iv->getFieldName(pos)) + ""; + modHtml += "
"; + } + } + modHtml += "
"; + + for(uint8_t ch = 1; ch <= modNum; ch ++) { + modHtml += "
CHANNEL " + String(ch) + ""; + for(uint8_t j = 0; j < 5; j++) { + switch(j) { + default: pos = (iv->getPosByChFld(ch, FLD_UDC)); break; + case 1: pos = (iv->getPosByChFld(ch, FLD_IDC)); break; + case 2: pos = (iv->getPosByChFld(ch, FLD_PDC)); break; + case 3: pos = (iv->getPosByChFld(ch, FLD_YD)); break; + case 4: pos = (iv->getPosByChFld(ch, FLD_YT)); break; + } + if(0xff != pos) { + modHtml += "" + String(iv->getValue(pos)); + modHtml += "" + String(iv->getUnit(pos)) + ""; + modHtml += "" + String(iv->getFieldName(pos)) + ""; + } + } + modHtml += "
"; + } + + modHtml += "
"; +#else + // dump all data to web frontend + modHtml = "
";
+            char topic[30], val[10];
+            for(uint8_t i = 0; i < iv->listLen; i++) {
+                snprintf(topic, 30, "%s/ch%d/%s", iv->name, iv->assign[i].ch, iv->getFieldName(i));
+                snprintf(val, 10, "%.3f %s", iv->getValue(i), iv->getUnit(i));
+                modHtml += String(topic) + ": " + String(val) + "\n";
+            }
+            modHtml += "
"; +#endif + } + } + + + mWeb->send(200, "text/html", modHtml); } @@ -274,25 +507,86 @@ void app::saveValues(bool webSend = true) { if(mWeb->args() > 0) { char *p; - char addr[20] = {0}; + char buf[20] = {0}; uint8_t i = 0; + uint16_t interval; + + // inverter + serial_u addr; + for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i ++) { + // address + mWeb->arg("inv" + String(i) + "Addr").toCharArray(buf, 20); + if(strlen(buf) == 0) + snprintf(buf, 20, "\0"); + addr.u64 = Serial2u64(buf); + mEep->write(ADDR_INV_ADDR + (i * 8), addr.u64); + + // name + mWeb->arg("inv" + String(i) + "Name").toCharArray(buf, 20); + mEep->write(ADDR_INV_NAME + (i * MAX_NAME_LENGTH), buf, MAX_NAME_LENGTH); + + // type + mWeb->arg("inv" + String(i) + "Type").toCharArray(buf, 20); + uint8_t type = atoi(buf); + mEep->write(ADDR_INV_TYPE + i, type); + } - memset(mHoymiles->mAddrBytes, 0, 6); - mWeb->arg("hoy_addr").toCharArray(addr, 20); + interval = mWeb->arg("invInterval").toInt(); + mEep->write(ADDR_INV_INTERVAL, interval); - p = strtok(addr, ":"); - while(NULL != p) { - mHoymiles->mAddrBytes[i++] = strtol(p, NULL, 16); - p = strtok(NULL, ":"); + + // pinout + for(uint8_t i = 0; i < 3; i ++) { + uint8_t pin = mWeb->arg(String(pinArgNames[i])).toInt(); + mEep->write(ADDR_PINOUT + i, pin); } - mEep->write(ADDR_HOY_ADDR, mHoymiles->mAddrBytes, HOY_ADDR_LEN); + + // nrf24 amplifier power + mSys->Radio.AmplifierPower = mWeb->arg("rf24Power").toInt() & 0x03; + mEep->write(ADDR_RF24_AMP_PWR, mSys->Radio.AmplifierPower); + + // mqtt + uint8_t mqttAddr[MQTT_ADDR_LEN] = {0}; + uint16_t mqttPort; + char mqttUser[MQTT_USER_LEN]; + char mqttPwd[MQTT_PWD_LEN]; + char mqttTopic[MQTT_TOPIC_LEN]; + mWeb->arg("mqttAddr").toCharArray(buf, 20); + i = 0; + p = strtok(buf, "."); + while(NULL != p) { + mqttAddr[i++] = atoi(p); + p = strtok(NULL, "."); + } + mWeb->arg("mqttUser").toCharArray(mqttUser, MQTT_USER_LEN); + mWeb->arg("mqttPwd").toCharArray(mqttPwd, MQTT_PWD_LEN); + mWeb->arg("mqttTopic").toCharArray(mqttTopic, MQTT_TOPIC_LEN); + interval = mWeb->arg("mqttIntvl").toInt(); + mqttPort = mWeb->arg("mqttPort").toInt(); + mEep->write(ADDR_MQTT_ADDR, mqttAddr, MQTT_ADDR_LEN); + mEep->write(ADDR_MQTT_PORT, mqttPort); + mEep->write(ADDR_MQTT_USER, mqttUser, MQTT_USER_LEN); + mEep->write(ADDR_MQTT_PWD, mqttPwd, MQTT_PWD_LEN); + mEep->write(ADDR_MQTT_TOPIC, mqttTopic, MQTT_TOPIC_LEN); + mEep->write(ADDR_MQTT_INTERVAL, interval); + + + // serial console + bool tmp; + interval = mWeb->arg("serIntvl").toInt(); + mEep->write(ADDR_SER_INTERVAL, interval); + tmp = (mWeb->arg("serEn") == "on"); + mEep->write(ADDR_SER_ENABLE, (uint8_t)((tmp) ? 0x01 : 0x00)); + tmp = (mWeb->arg("serDbg") == "on"); + mEep->write(ADDR_SER_DEBUG, (uint8_t)((tmp) ? 0x01 : 0x00)); updateCrc(); if((mWeb->arg("reboot") == "on")) showReboot(); else { - mWeb->send(200, "text/html", "Setup saved" + mShowRebootRequest = true; + mWeb->send(200, "text/html", "Setup saved" "

saved

"); } } @@ -304,11 +598,11 @@ void app::saveValues(bool webSend = true) { //----------------------------------------------------------------------------- -void app::dumpBuf(uint8_t buf[], uint8_t len) { - for(uint8_t i = 0; i < len; i ++) { - if((i % 8 == 0) && (i != 0)) - Serial.println(); - Serial.print(String(buf[i], HEX) + " "); - } - Serial.println(); +void app::updateCrc(void) { + Main::updateCrc(); + + uint16_t crc; + crc = buildEEpCrc(ADDR_START_SETTINGS, (ADDR_NEXT - ADDR_START_SETTINGS)); + //DPRINTLN("new CRC: " + String(crc, HEX)); + mEep->write(ADDR_SETTINGS_CRC, crc); } diff --git a/tools/esp8266/app.h b/tools/esp8266/app.h index 01883643..26efc6e7 100644 --- a/tools/esp8266/app.h +++ b/tools/esp8266/app.h @@ -8,49 +8,88 @@ #include "main.h" #include "CircularBuffer.h" -#include "hoymiles.h" +#include "hmSystem.h" +#include "mqtt.h" +typedef CircularBuffer BufferType; +typedef HmRadio RadioType; +typedef Inverter InverterType; +typedef HmSystem HmSystemType; + +const char* const wemosPins[] = {"D3 (GPIO0)", "TX (GPIO1)", "D4 (GPIO2)", "RX (GPIO3)", + "D2 (GPIO4)", "D1 (GPIO5)", "GPIO6", "GPIO7", "GPIO8", + "GPIO9", "GPIO10", "GPIO11", "D6 (GPIO12)", "D7 (GPIO13)", + "D5 (GPIO14)", "D8 (GPIO15)", "D0 (GPIO16)"}; +const char* const pinNames[] = {"CS", "CE", "IRQ"}; +const char* const pinArgNames[] = {"pinCs", "pinCe", "pinIrq"}; + +const uint8_t dbgCmds[] = {0x01, 0x02, 0x03, 0x81, 0x82, 0x83, 0x84}; +#define DBG_CMD_LIST_LEN 7 class app : public Main { public: app(); ~app(); - void setup(const char *ssid, const char *pwd, uint32_t timeout); + void setup(uint32_t timeout); void loop(void); void handleIntr(void); - private: - void initRadio(void); - void sendPacket(uint8_t data[], uint8_t length); - - void sendTicker(void); + uint8_t getIrqPin(void) { + return mSys->Radio.pinIrq; + } + private: void showIndex(void); void showSetup(void); void showSave(void); - void showCmdStatistics(void); + void showErase(void); + void showStatistics(void); + void showHoymiles(void); + void showLiveData(void); void saveValues(bool webSend); - void dumpBuf(uint8_t buf[], uint8_t len); - - uint8_t mState; - bool mKeyPressed; - - RF24 *mRadio; - hoymiles *mHoymiles; - CircularBuffer *mBufCtrl; - NRF24_packet_t mBuffer[PACKET_BUFFER_SIZE]; - - - Ticker *mSendTicker; - uint32_t mSendCnt; - uint8_t mSendBuf[MAX_RF_PAYLOAD_SIZE]; - bool mFlagSend; - uint8_t mSendChannel; - - uint32_t mCmds[6]; - uint32_t mChannelStat[4]; + void updateCrc(void); + + uint64_t Serial2u64(const char *val) { + char tmp[3] = {0}; + uint64_t ret = 0ULL; + uint64_t u64; + for(uint8_t i = 0; i < 6; i++) { + tmp[0] = val[i*2]; + tmp[1] = val[i*2 + 1]; + if((tmp[0] == '\0') || (tmp[1] == '\0')) + break; + u64 = strtol(tmp, NULL, 16); + ret |= (u64 << ((5-i) << 3)); + } + return ret; + } + + bool mShowRebootRequest; + + HmSystemType *mSys; + + uint16_t mSendTicker; + uint16_t mSendInterval; + + uint32_t mPacketIds[DBG_CMD_LIST_LEN+1]; + uint32_t mRecCnt; + + // timer + uint32_t mTicker; + bool mSerialValues; + bool mSerialDebug; + + uint32_t mRxTicker; + + // mqtt + mqtt mMqtt; + uint16_t mMqttTicker; + uint16_t mMqttInterval; + bool mMqttActive; + uint16_t mSerialTicker; + uint16_t mSerialInterval; }; #endif /*__APP_H__*/ diff --git a/tools/esp8266/config.h b/tools/esp8266/config.h new file mode 100644 index 00000000..c37f979a --- /dev/null +++ b/tools/esp8266/config.h @@ -0,0 +1,44 @@ +#ifndef __CONFIG_H__ +#define __CONFIG_H__ + +// fallback WiFi info +#define FB_WIFI_SSID "YOUR_WIFI_SSID" +#define FB_WIFI_PWD "YOUR_WIFI_PWD" + + +// access point info +#define WIFI_AP_SSID "AHOY DTU" +#define WIFI_AP_PWD "esp_8266" +// stay in access point mode all the time +//#define AP_ONLY + + +//------------------------------------- +// CONFIGURATION - COMPILE TIME +//------------------------------------- +// time in seconds how long the station info (ssid + pwd) will be tried +#define WIFI_TRY_CONNECT_TIME 30 + +// time during the ESP will act as access point on connection failure (to +// station) in seconds +#define WIFI_AP_ACTIVE_TIME 3*60 + +// default device name +#define DEF_DEVICE_NAME "ESP-DTU" + +// number of packets hold in buffer +#define PACKET_BUFFER_SIZE 30 + +// number of configurable inverters +#define MAX_NUM_INVERTERS 3 + +// maximum human readable inverter name length +#define MAX_NAME_LENGTH 16 + +// maximum buffer length of packet received / sent to RF24 module +#define MAX_RF_PAYLOAD_SIZE 32 + +// changes the style of "/setup" page, visualized = nicer +#define LIVEDATA_VISUALIZED + +#endif /*__CONFIG_H__*/ diff --git a/tools/esp8266/debug.h b/tools/esp8266/debug.h new file mode 100644 index 00000000..2699b943 --- /dev/null +++ b/tools/esp8266/debug.h @@ -0,0 +1,39 @@ +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +#ifdef NDEBUG + #define DPRINT(str) + #define DPRINTLN(str) +#else + +#ifndef DSERIAL + #define DSERIAL Serial +#endif + + template + inline void DPRINT(T str) { DSERIAL.print(str); } + template + inline void DPRINTLN(T str) { DPRINT(str); DPRINT(F("\r\n")); } + inline void DHEX(uint8_t b) { + if( b<0x10 ) DSERIAL.print('0'); + DSERIAL.print(b,HEX); + } + inline void DHEX(uint16_t b) { + if( b<0x10 ) DSERIAL.print(F("000")); + else if( b<0x100 ) DSERIAL.print(F("00")); + else if( b<0x1000 ) DSERIAL.print(F("0")); + DSERIAL.print(b,HEX); + } + inline void DHEX(uint32_t b) { + if( b<0x10 ) DSERIAL.print(F("0000000")); + else if( b<0x100 ) DSERIAL.print(F("000000")); + else if( b<0x1000 ) DSERIAL.print(F("00000")); + else if( b<0x10000 ) DSERIAL.print(F("0000")); + else if( b<0x100000 ) DSERIAL.print(F("000")); + else if( b<0x1000000 ) DSERIAL.print(F("00")); + else if( b<0x10000000 ) DSERIAL.print(F("0")); + DSERIAL.print(b,HEX); + } +#endif + +#endif /*__DEBUG_H__*/ diff --git a/tools/esp8266/defines.h b/tools/esp8266/defines.h index 4939da5b..459125a8 100644 --- a/tools/esp8266/defines.h +++ b/tools/esp8266/defines.h @@ -1,41 +1,92 @@ #ifndef __DEFINES_H__ #define __DEFINES_H__ +#include "config.h" //------------------------------------- -// PINOUT +// PINOUT (Default, can be changed in setup) //------------------------------------- -#define RF24_IRQ_PIN 4 -#define RF24_CE_PIN 5 #define RF24_CS_PIN 15 +#define RF24_CE_PIN 2 +#define RF24_IRQ_PIN 0 //------------------------------------- // VERSION //------------------------------------- #define VERSION_MAJOR 0 -#define VERSION_MINOR 1 +#define VERSION_MINOR 3 #define VERSION_PATCH 9 +//------------------------------------- +typedef struct { + uint8_t rxCh; + uint8_t packet[MAX_RF_PAYLOAD_SIZE]; +} packet_t; + + //------------------------------------- // EEPROM //------------------------------------- #define SSID_LEN 32 -#define PWD_LEN 64 -#define DEVNAME_LEN 32 -#define CRC_LEN 2 +#define PWD_LEN 63 +#define DEVNAME_LEN 16 +#define CRC_LEN 2 // uint16_t + +#define INV_ADDR_LEN MAX_NUM_INVERTERS * 8 // uint64_t +#define INV_NAME_LEN MAX_NUM_INVERTERS * MAX_NAME_LENGTH // char[] +#define INV_TYPE_LEN MAX_NUM_INVERTERS * 1 // uint8_t +#define INV_INTERVAL_LEN 2 // uint16_t + +#define PINOUT_LEN 3 // 3 pins: CS, CE, IRQ + +#define RF24_AMP_PWR_LEN 1 + +#define MQTT_ADDR_LEN 4 // IP +#define MQTT_USER_LEN 16 +#define MQTT_PWD_LEN 32 +#define MQTT_TOPIC_LEN 32 +#define MQTT_INTERVAL_LEN 2 // uint16_t +#define MQTT_PORT_LEN 2 // uint16_t + +#define SER_ENABLE_LEN 1 // uint8_t +#define SER_DEBUG_LEN 1 // uint8_t +#define SER_INTERVAL_LEN 2 // uint16_t -#define HOY_ADDR_LEN 6 #define ADDR_START 0 #define ADDR_SSID ADDR_START #define ADDR_PWD ADDR_SSID + SSID_LEN #define ADDR_DEVNAME ADDR_PWD + PWD_LEN -#define ADDR_HOY_ADDR ADDR_DEVNAME + DEVNAME_LEN +#define ADDR_WIFI_CRC ADDR_DEVNAME + DEVNAME_LEN +#define ADDR_START_SETTINGS ADDR_WIFI_CRC + CRC_LEN + +#define ADDR_PINOUT ADDR_START_SETTINGS + +#define ADDR_RF24_AMP_PWR ADDR_PINOUT + PINOUT_LEN + +#define ADDR_INV_ADDR ADDR_RF24_AMP_PWR + RF24_AMP_PWR_LEN +#define ADDR_INV_NAME ADDR_INV_ADDR + INV_ADDR_LEN +#define ADDR_INV_TYPE ADDR_INV_NAME + INV_NAME_LEN +#define ADDR_INV_INTERVAL ADDR_INV_TYPE + INV_TYPE_LEN + +#define ADDR_MQTT_ADDR ADDR_INV_INTERVAL + INV_INTERVAL_LEN +#define ADDR_MQTT_USER ADDR_MQTT_ADDR + MQTT_ADDR_LEN +#define ADDR_MQTT_PWD ADDR_MQTT_USER + MQTT_USER_LEN +#define ADDR_MQTT_TOPIC ADDR_MQTT_PWD + MQTT_PWD_LEN +#define ADDR_MQTT_INTERVAL ADDR_MQTT_TOPIC + MQTT_TOPIC_LEN +#define ADDR_MQTT_PORT ADDR_MQTT_INTERVAL + MQTT_INTERVAL_LEN + +#define ADDR_SER_ENABLE ADDR_MQTT_PORT + MQTT_PORT_LEN +#define ADDR_SER_DEBUG ADDR_SER_ENABLE + SER_ENABLE_LEN +#define ADDR_SER_INTERVAL ADDR_SER_DEBUG + SER_DEBUG_LEN +#define ADDR_NEXT ADDR_SER_INTERVAL + SER_INTERVAL_LEN -#define ADDR_NEXT ADDR_HOY_ADDR + HOY_ADDR_LEN +#define ADDR_SETTINGS_CRC 400 -#define ADDR_SETTINGS_CRC 200 +#if(ADDR_SETTINGS_CRC <= ADDR_NEXT) +#error address overlap! +#endif #endif /*__DEFINES_H__*/ diff --git a/tools/esp8266/eep.cpp b/tools/esp8266/eep.cpp deleted file mode 100644 index 97a3c600..00000000 --- a/tools/esp8266/eep.cpp +++ /dev/null @@ -1,130 +0,0 @@ -#include "eep.h" -#include - - -//----------------------------------------------------------------------------- -eep::eep() { - EEPROM.begin(500); -} - - -//----------------------------------------------------------------------------- -eep::~eep() { - EEPROM.end(); -} - - -//----------------------------------------------------------------------------- -void eep::read(uint32_t addr, char *str, uint8_t length) { - for(uint8_t i = 0; i < length; i ++) { - *(str++) = (char)EEPROM.read(addr++); - } -} - - -//----------------------------------------------------------------------------- -void eep::read(uint32_t addr, float *value) { - uint8_t *p = (uint8_t*)value; - for(uint8_t i = 0; i < 4; i ++) { - *(p++) = (uint8_t)EEPROM.read(addr++); - } -} - - -//----------------------------------------------------------------------------- -void eep::read(uint32_t addr, bool *value) { - uint8_t intVal = 0x00; - intVal = EEPROM.read(addr++); - *value = (intVal == 0x01); -} - - -//----------------------------------------------------------------------------- -void eep::read(uint32_t addr, uint8_t *value) { - *value = (EEPROM.read(addr++)); -} - - -//----------------------------------------------------------------------------- -void eep::read(uint32_t addr, uint8_t data[], uint8_t length) { - for(uint8_t i = 0; i < length; i ++) { - *(data++) = EEPROM.read(addr++); - } -} - - -//----------------------------------------------------------------------------- -void eep::read(uint32_t addr, uint16_t *value) { - *value = (EEPROM.read(addr++) << 8); - *value |= (EEPROM.read(addr++)); -} - - -//----------------------------------------------------------------------------- -void eep::read(uint32_t addr, uint32_t *value) { - *value = (EEPROM.read(addr++) << 24); - *value |= (EEPROM.read(addr++) << 16); - *value |= (EEPROM.read(addr++) << 8); - *value |= (EEPROM.read(addr++)); -} - - -//----------------------------------------------------------------------------- -void eep::write(uint32_t addr, const char *str, uint8_t length) { - for(uint8_t i = 0; i < length; i ++) { - EEPROM.write(addr++, str[i]); - } - EEPROM.commit(); -} - - -//----------------------------------------------------------------------------- -void eep::write(uint32_t addr, uint8_t data[], uint8_t length) { - for(uint8_t i = 0; i < length; i ++) { - EEPROM.write(addr++, data[i]); - } - EEPROM.commit(); -} - - -//----------------------------------------------------------------------------- -void eep::write(uint32_t addr, float value) { - uint8_t *p = (uint8_t*)&value; - for(uint8_t i = 0; i < 4; i ++) { - EEPROM.write(addr++, p[i]); - } - EEPROM.commit(); -} - - -//----------------------------------------------------------------------------- -void eep::write(uint32_t addr, bool value) { - uint8_t intVal = (value) ? 0x01 : 0x00; - EEPROM.write(addr++, intVal); - EEPROM.commit(); -} - - -//----------------------------------------------------------------------------- -void eep::write(uint32_t addr, uint8_t value) { - EEPROM.write(addr++, value); - EEPROM.commit(); -} - - -//----------------------------------------------------------------------------- -void eep::write(uint32_t addr, uint16_t value) { - EEPROM.write(addr++, (value >> 8) & 0xff); - EEPROM.write(addr++, (value ) & 0xff); - EEPROM.commit(); -} - - -//----------------------------------------------------------------------------- -void eep::write(uint32_t addr, uint32_t value) { - EEPROM.write(addr++, (value >> 24) & 0xff); - EEPROM.write(addr++, (value >> 16) & 0xff); - EEPROM.write(addr++, (value >> 8) & 0xff); - EEPROM.write(addr++, (value ) & 0xff); - EEPROM.commit(); -} diff --git a/tools/esp8266/eep.h b/tools/esp8266/eep.h index 36b03914..a49cae67 100644 --- a/tools/esp8266/eep.h +++ b/tools/esp8266/eep.h @@ -2,29 +2,132 @@ #define __EEP_H__ #include "Arduino.h" +#include class eep { public: - eep(); - ~eep(); - - void read(uint32_t addr, char *str, uint8_t length); - void read(uint32_t addr, float *value); - void read(uint32_t addr, bool *value); - void read(uint32_t addr, uint8_t *value); - void read(uint32_t addr, uint8_t data[], uint8_t length); - void read(uint32_t addr, uint16_t *value); - void read(uint32_t addr, uint32_t *value); - void write(uint32_t addr, const char *str, uint8_t length); - void write(uint32_t addr, uint8_t data[], uint8_t length); - void write(uint32_t addr, float value); - void write(uint32_t addr, bool value); - void write(uint32_t addr, uint8_t value); - void write(uint32_t addr, uint16_t value); - void write(uint32_t addr, uint32_t value); - - private: + eep() { + EEPROM.begin(500); + } + ~eep() { + EEPROM.end(); + } + void read(uint32_t addr, char *str, uint8_t length) { + for(uint8_t i = 0; i < length; i ++) { + *(str++) = (char)EEPROM.read(addr++); + } + } + + void read(uint32_t addr, float *value) { + uint8_t *p = (uint8_t*)value; + for(uint8_t i = 0; i < 4; i ++) { + *(p++) = (uint8_t)EEPROM.read(addr++); + } + } + + void read(uint32_t addr, bool *value) { + uint8_t intVal = 0x00; + intVal = EEPROM.read(addr++); + *value = (intVal == 0x01); + } + + void read(uint32_t addr, uint8_t *value) { + *value = (EEPROM.read(addr++)); + } + + void read(uint32_t addr, uint8_t data[], uint16_t length) { + for(uint16_t i = 0; i < length; i ++) { + *(data++) = EEPROM.read(addr++); + } + } + + void read(uint32_t addr, uint16_t *value) { + *value = (EEPROM.read(addr++) << 8); + *value |= (EEPROM.read(addr++)); + } + + void read(uint32_t addr, uint32_t *value) { + *value = (EEPROM.read(addr++) << 24); + *value |= (EEPROM.read(addr++) << 16); + *value |= (EEPROM.read(addr++) << 8); + *value |= (EEPROM.read(addr++)); + } + + void read(uint32_t addr, uint64_t *value) { + read(addr, (uint32_t *)value); + *value <<= 32; + uint32_t tmp; + read(addr+4, &tmp); + *value |= tmp; + /**value = (EEPROM.read(addr++) << 56); + *value |= (EEPROM.read(addr++) << 48); + *value |= (EEPROM.read(addr++) << 40); + *value |= (EEPROM.read(addr++) << 32); + *value |= (EEPROM.read(addr++) << 24); + *value |= (EEPROM.read(addr++) << 16); + *value |= (EEPROM.read(addr++) << 8); + *value |= (EEPROM.read(addr++));*/ + } + + void write(uint32_t addr, const char *str, uint8_t length) { + for(uint8_t i = 0; i < length; i ++) { + EEPROM.write(addr++, str[i]); + } + EEPROM.commit(); + } + + void write(uint32_t addr, uint8_t data[], uint16_t length) { + for(uint16_t i = 0; i < length; i ++) { + EEPROM.write(addr++, data[i]); + } + EEPROM.commit(); + } + + void write(uint32_t addr, float value) { + uint8_t *p = (uint8_t*)&value; + for(uint8_t i = 0; i < 4; i ++) { + EEPROM.write(addr++, p[i]); + } + EEPROM.commit(); + } + + void write(uint32_t addr, bool value) { + uint8_t intVal = (value) ? 0x01 : 0x00; + EEPROM.write(addr++, intVal); + EEPROM.commit(); + } + + void write(uint32_t addr, uint8_t value) { + EEPROM.write(addr++, value); + EEPROM.commit(); + } + + void write(uint32_t addr, uint16_t value) { + EEPROM.write(addr++, (value >> 8) & 0xff); + EEPROM.write(addr++, (value ) & 0xff); + EEPROM.commit(); + } + + void write(uint32_t addr, uint32_t value) { + EEPROM.write(addr++, (value >> 24) & 0xff); + EEPROM.write(addr++, (value >> 16) & 0xff); + EEPROM.write(addr++, (value >> 8) & 0xff); + EEPROM.write(addr++, (value ) & 0xff); + EEPROM.commit(); + } + + void write(uint64_t addr, uint64_t value) { + EEPROM.write(addr++, (value >> 56) & 0xff); + EEPROM.write(addr++, (value >> 48) & 0xff); + EEPROM.write(addr++, (value >> 40) & 0xff); + EEPROM.write(addr++, (value >> 32) & 0xff); + EEPROM.write(addr++, (value >> 24) & 0xff); + EEPROM.write(addr++, (value >> 16) & 0xff); + EEPROM.write(addr++, (value >> 8) & 0xff); + EEPROM.write(addr++, (value ) & 0xff); + EEPROM.commit(); + } }; #endif /*__EEP_H__*/ diff --git a/tools/esp8266/esp8266.ino b/tools/esp8266/esp8266.ino index 2dcc84c3..4d5ca3b0 100644 --- a/tools/esp8266/esp8266.ino +++ b/tools/esp8266/esp8266.ino @@ -1,14 +1,23 @@ + +#include "Arduino.h" + +#include +#include +#include +#include + +#include #include "app.h" +#include "config.h" app myApp; //----------------------------------------------------------------------------- void setup() { - pinMode(RF24_IRQ_PIN, INPUT_PULLUP); - attachInterrupt(digitalPinToInterrupt(RF24_IRQ_PIN), handleIntr, FALLING); + myApp.setup(WIFI_TRY_CONNECT_TIME); - // AP name, password, timeout - myApp.setup("ESP AHOY", "esp_8266", 15); + // TODO: move to HmRadio + attachInterrupt(digitalPinToInterrupt(myApp.getIrqPin()), handleIntr, FALLING); } @@ -22,4 +31,3 @@ void loop() { ICACHE_RAM_ATTR void handleIntr(void) { myApp.handleIntr(); } - diff --git a/tools/esp8266/hmDefines.h b/tools/esp8266/hmDefines.h new file mode 100644 index 00000000..1c27ced3 --- /dev/null +++ b/tools/esp8266/hmDefines.h @@ -0,0 +1,159 @@ +#ifndef __HM_DEFINES_H__ +#define __HM_DEFINES_H__ + +#include "debug.h" +#include + + +union serial_u { + uint64_t u64; + uint8_t b[8]; +}; + + +// units +enum {UNIT_V = 0, UNIT_A, UNIT_W, UNIT_WH, UNIT_KWH, UNIT_HZ, UNIT_C, UNIT_PCT}; +const char* const units[] = {"V", "A", "W", "Wh", "kWh", "Hz", "°C", "%"}; + + +// field types +enum {FLD_UDC = 0, FLD_IDC, FLD_PDC, FLD_YD, FLD_YW, FLD_YT, + FLD_UAC, FLD_IAC, FLD_PAC, FLD_F, FLD_T, FLD_PCT}; +const char* const fields[] = {"U_DC", "I_DC", "P_DC", "YieldDay", "YieldWeek", "YieldTotal", + "U_AC", "I_AC", "P_AC", "Freq", "Temp", "Pct"}; + + +// indices to calculation functions, defined in hmInverter.h +enum {CALC_YT_CH0 = 0, CALC_YD_CH0, CALC_UDC_CH}; + + +// CH0 is default channel (freq, ac, temp) +enum {CH0 = 0, CH1, CH2, CH3, CH4}; +// received command ids, special command CMDFF for calculations +enum {CMD01 = 0x01, CMD02, CMD03, CMD82 = 0x82, CMD83, CMD84, CMDFF=0xff}; + +enum {INV_TYPE_HM600 = 0, INV_TYPE_HM1200, INV_TYPE_HM400, INV_TYPE_HM800}; +const char* const invTypes[] = {"HM600", "HM1200 / HM1500", "HM400", "HM800"}; +#define NUM_INVERTER_TYPES 4 + + +typedef struct { + uint8_t fieldId; // field id + uint8_t unitId; // uint id + uint8_t ch; // channel 0 - 3 + uint8_t cmdId; // received command id + uint8_t start; // pos of first byte in buffer + uint8_t num; // number of bytes in buffer + uint16_t div; // divisor +} byteAssign_t; + + +/** + * indices are built for the buffer starting with cmd-id in first byte + * (complete payload in buffer) + * */ + +//------------------------------------- +// HM400 HM350?, HM300? +//------------------------------------- +const byteAssign_t hm400assignment[] = { + { FLD_UDC, UNIT_V, CH1, CMD01, 3, 2, 10 }, + { FLD_IDC, UNIT_A, CH1, CMD01, 5, 2, 100 }, + { FLD_PDC, UNIT_W, CH1, CMD01, 7, 2, 10 }, + { FLD_YT, UNIT_KWH, CH1, CMD01, 9, 4, 1000 }, + { FLD_YD, UNIT_WH, CH1, CMD01, 13, 2, 1 }, + { FLD_UAC, UNIT_V, CH0, CMD01, 15, 2, 10 }, + { FLD_F, UNIT_HZ, CH0, CMD82, 1, 2, 100 }, + { FLD_PAC, UNIT_W, CH0, CMD82, 3, 2, 10 }, + { FLD_IAC, UNIT_A, CH0, CMD82, 7, 2, 100 }, + { FLD_T, UNIT_C, CH0, CMD82, 11, 2, 10 } +}; +#define HM400_LIST_LEN (sizeof(hm400assignment) / sizeof(byteAssign_t)) + + +//------------------------------------- +// HM600, HM700 +//------------------------------------- +const byteAssign_t hm600assignment[] = { + { FLD_UDC, UNIT_V, CH1, CMD01, 3, 2, 10 }, + { FLD_IDC, UNIT_A, CH1, CMD01, 5, 2, 100 }, + { FLD_PDC, UNIT_W, CH1, CMD01, 7, 2, 10 }, + { FLD_UDC, UNIT_V, CH2, CMD01, 9, 2, 10 }, + { FLD_IDC, UNIT_A, CH2, CMD01, 11, 2, 100 }, + { FLD_PDC, UNIT_W, CH2, CMD01, 13, 2, 10 }, + { FLD_YW, UNIT_WH, CH0, CMD02, 1, 2, 1 }, + { FLD_YT, UNIT_KWH, CH0, CMD02, 3, 4, 1000 }, + { FLD_YD, UNIT_WH, CH1, CMD02, 7, 2, 1 }, + { FLD_YD, UNIT_WH, CH2, CMD02, 9, 2, 1 }, + { FLD_UAC, UNIT_V, CH0, CMD02, 11, 2, 10 }, + { FLD_F, UNIT_HZ, CH0, CMD02, 13, 2, 100 }, + { FLD_PAC, UNIT_W, CH0, CMD02, 15, 2, 10 }, + { FLD_IAC, UNIT_A, CH0, CMD83, 3, 2, 100 }, + { FLD_T, UNIT_C, CH0, CMD83, 7, 2, 10 } +}; +#define HM600_LIST_LEN (sizeof(hm600assignment) / sizeof(byteAssign_t)) + + +//------------------------------------- +// HM800 +//------------------------------------- +const byteAssign_t hm800assignment[] = { + + { FLD_UDC, UNIT_V, CH1, CMD01, 3, 2, 10 }, + { FLD_IDC, UNIT_A, CH1, CMD01, 5, 2, 100 }, + { FLD_PDC, UNIT_W, CH1, CMD01, 7, 2, 10 }, + { FLD_UDC, UNIT_V, CH2, CMD01, 9, 2, 10 }, + { FLD_IDC, UNIT_A, CH2, CMD01, 11, 2, 100 }, + { FLD_PDC, UNIT_W, CH2, CMD01, 13, 2, 10 }, + { FLD_YW, UNIT_WH, CH0, CMD02, 1, 2, 1 }, + { FLD_YT, UNIT_KWH, CH0, CMD02, 3, 4, 1000 }, + { FLD_YD, UNIT_WH, CH1, CMD02, 7, 2, 1 }, + { FLD_YD, UNIT_WH, CH2, CMD02, 9, 2, 1 }, + { FLD_UAC, UNIT_V, CH0, CMD02, 11, 2, 10 }, + { FLD_F, UNIT_HZ, CH0, CMD02, 13, 2, 100 }, + { FLD_PAC, UNIT_W, CH0, CMD02, 15, 2, 10 }, + { FLD_IAC, UNIT_A, CH0, CMD83, 3, 2, 100 }, + { FLD_T, UNIT_C, CH0, CMD83, 7, 2, 10 } +}; +#define HM800_LIST_LEN (sizeof(hm800assignment) / sizeof(byteAssign_t)) + + +//------------------------------------- +// HM1200, HM1500 +//------------------------------------- +const byteAssign_t hm1200assignment[] = { + { FLD_UDC, UNIT_V, CH1, CMD01, 3, 2, 10 }, + { FLD_IDC, UNIT_A, CH1, CMD01, 5, 2, 100 }, + { FLD_PDC, UNIT_W, CH1, CMD01, 9, 2, 10 }, + { FLD_YD, UNIT_WH, CH1, CMD02, 5, 2, 1 }, + { FLD_YT, UNIT_KWH, CH1, CMD01, 13, 4, 1000 }, + { FLD_UDC, UNIT_V, CH3, CMD02, 9, 2, 10 }, + { FLD_IDC, UNIT_A, CH2, CMD01, 7, 2, 100 }, + { FLD_PDC, UNIT_W, CH2, CMD01, 11, 2, 10 }, + { FLD_YD, UNIT_WH, CH2, CMD02, 7, 2, 1 }, + { FLD_YT, UNIT_KWH, CH2, CMD02, 1, 4, 1000 }, + { FLD_IDC, UNIT_A, CH3, CMD02, 11, 2, 100 }, + { FLD_PDC, UNIT_W, CH3, CMD02, 15, 2, 10 }, + { FLD_YD, UNIT_WH, CH3, CMD03, 11, 2, 1 }, + { FLD_YT, UNIT_KWH, CH3, CMD03, 3, 4, 1000 }, + { FLD_IDC, UNIT_A, CH4, CMD02, 13, 2, 100 }, + { FLD_PDC, UNIT_W, CH4, CMD03, 1, 2, 10 }, + { FLD_YD, UNIT_WH, CH4, CMD03, 13, 2, 1 }, + { FLD_YT, UNIT_KWH, CH4, CMD03, 7, 4, 1000 }, + { FLD_UAC, UNIT_V, CH0, CMD03, 15, 2, 10 }, + { FLD_IAC, UNIT_A, CH0, CMD84, 7, 2, 100 }, + { FLD_PAC, UNIT_W, CH0, CMD84, 3, 2, 10 }, + { FLD_F, UNIT_HZ, CH0, CMD84, 1, 2, 100 }, + { FLD_PCT, UNIT_PCT, CH0, CMD84, 9, 2, 10 }, + { FLD_T, UNIT_C, CH0, CMD84, 11, 2, 10 }, + { FLD_YD, UNIT_WH, CH0, CMDFF, CALC_YD_CH0, 0, 0 }, + { FLD_YT, UNIT_KWH, CH0, CMDFF, CALC_YT_CH0, 0, 0 }, + { FLD_UDC, UNIT_V, CH2, CMDFF, CALC_UDC_CH, CH1, 0 }, + { FLD_UDC, UNIT_V, CH4, CMDFF, CALC_UDC_CH, CH3, 0 } +}; +#define HM1200_LIST_LEN (sizeof(hm1200assignment) / sizeof(byteAssign_t)) + + + + +#endif /*__HM_DEFINES_H__*/ diff --git a/tools/esp8266/hmInverter.h b/tools/esp8266/hmInverter.h new file mode 100644 index 00000000..f5e823e8 --- /dev/null +++ b/tools/esp8266/hmInverter.h @@ -0,0 +1,213 @@ +#ifndef __HM_INVERTER_H__ +#define __HM_INVERTER_H__ + +#include "hmDefines.h" + +/** + * For values which are of interest and not transmitted by the inverter can be + * calculated automatically. + * A list of functions can be linked to the assignment and will be executed + * automatically. Their result does not differ from original read values. + * The special command 0xff (CMDFF) must be used. + */ + +// forward declaration of class +template +class Inverter; + + +// prototypes +template +static T calcYieldTotalCh0(Inverter<> *iv, uint8_t arg0); + +template +static T calcYieldDayCh0(Inverter<> *iv, uint8_t arg0); + +template +static T calcUdcCh(Inverter<> *iv, uint8_t arg0); + +template +using func_t = T (Inverter<> *, uint8_t); + +template +struct calcFunc_t { + uint8_t funcId; // unique id + func_t* func; // function pointer +} ; + + +// list of all available functions, mapped in hmDefines.h +template +const calcFunc_t calcFunctions[] = { + { CALC_YT_CH0, &calcYieldTotalCh0 }, + { CALC_YD_CH0, &calcYieldDayCh0 }, + { CALC_UDC_CH, &calcUdcCh } +}; + + +template +class Inverter { + public: + uint8_t id; // unique id + char name[MAX_NAME_LENGTH]; // human readable name, eg. "HM-600.1" + uint8_t type; // integer which refers to inverter type + byteAssign_t* assign; // type of inverter + uint8_t listLen; // length of assignments + serial_u serial; // serial number as on barcode + serial_u radioId; // id converted to modbus + uint8_t channels; // number of PV channels (1-4) + RECORDTYPE *record; // pointer for values + + Inverter() { + + } + + ~Inverter() { + // TODO: cleanup + } + + void init(void) { + getAssignment(); + toRadioId(); + record = new RECORDTYPE[listLen]; + memset(name, 0, MAX_NAME_LENGTH); + memset(record, 0, sizeof(RECORDTYPE) * listLen); + } + + uint8_t getPosByChFld(uint8_t channel, uint8_t fieldId) { + uint8_t pos = 0; + for(; pos < listLen; pos++) { + if((assign[pos].ch == channel) && (assign[pos].fieldId == fieldId)) + break; + } + return (pos >= listLen) ? 0xff : pos; + } + + const char *getFieldName(uint8_t pos) { + return fields[assign[pos].fieldId]; + } + + const char *getUnit(uint8_t pos) { + return units[assign[pos].unitId]; + } + + uint8_t getChannel(uint8_t pos) { + return assign[pos].ch; + } + + uint8_t getCmdId(uint8_t pos) { + return assign[pos].cmdId; + } + + void addValue(uint8_t pos, uint8_t buf[]) { + uint8_t ptr = assign[pos].start; + uint8_t end = ptr + assign[pos].num; + uint16_t div = assign[pos].div; + + uint32_t val = 0; + do { + val <<= 8; + val |= buf[ptr]; + } while(++ptr != end); + + record[pos] = (RECORDTYPE)(val) / (RECORDTYPE)(div); + } + + RECORDTYPE getValue(uint8_t pos) { + return record[pos]; + } + + void doCalculations(void) { + for(uint8_t i = 0; i < listLen; i++) { + if(CMDFF == assign[i].cmdId) { + record[i] = calcFunctions[assign[i].start].func(this, assign[i].num); + } + } + } + + private: + void toRadioId(void) { + radioId.u64 = 0ULL; + radioId.b[4] = serial.b[0]; + radioId.b[3] = serial.b[1]; + radioId.b[2] = serial.b[2]; + radioId.b[1] = serial.b[3]; + radioId.b[0] = 0x01; + } + + void getAssignment(void) { + if(INV_TYPE_HM400 == type) { + listLen = (uint8_t)(HM400_LIST_LEN); + assign = (byteAssign_t*)hm400assignment; + channels = 1; + } + else if(INV_TYPE_HM600 == type) { + listLen = (uint8_t)(HM600_LIST_LEN); + assign = (byteAssign_t*)hm600assignment; + channels = 2; + } + else if(INV_TYPE_HM800 == type) { + listLen = (uint8_t)(HM800_LIST_LEN); + assign = (byteAssign_t*)hm800assignment; + channels = 2; + } + else if(INV_TYPE_HM1200 == type) { + listLen = (uint8_t)(HM1200_LIST_LEN); + assign = (byteAssign_t*)hm1200assignment; + channels = 4; + } + else { + listLen = 0; + channels = 0; + assign = NULL; + } + } +}; + + +/** + * To calculate values which are not transmitted by the unit there is a generic + * list of functions which can be linked to the assignment. + * The special command 0xff (CMDFF) must be used. + */ + +template +static T calcYieldTotalCh0(Inverter<> *iv, uint8_t arg0) { + if(NULL != iv) { + T yield = 0; + for(uint8_t i = 1; i <= iv->channels; i++) { + uint8_t pos = iv->getPosByChFld(i, FLD_YT); + yield += iv->getValue(pos); + } + return yield; + } + return 0.0; +} + +template +static T calcYieldDayCh0(Inverter<> *iv, uint8_t arg0) { + if(NULL != iv) { + T yield = 0; + for(uint8_t i = 1; i <= iv->channels; i++) { + uint8_t pos = iv->getPosByChFld(i, FLD_YD); + yield += iv->getValue(pos); + } + return yield; + } + return 0.0; +} + +template +static T calcUdcCh(Inverter<> *iv, uint8_t arg0) { + // arg0 = channel of source + for(uint8_t i = 0; i < iv->listLen; i++) { + if((FLD_UDC == iv->assign[i].fieldId) && (arg0 == iv->assign[i].ch)) { + return iv->getValue(i); + } + } + + return 0.0; +} + + +#endif /*__HM_INVERTER_H__*/ diff --git a/tools/esp8266/hmRadio.h b/tools/esp8266/hmRadio.h new file mode 100644 index 00000000..a251b7db --- /dev/null +++ b/tools/esp8266/hmRadio.h @@ -0,0 +1,328 @@ +#ifndef __RADIO_H__ +#define __RADIO_H__ + +#include +#include +#include "crc.h" + +//#define CHANNEL_HOP // switch between channels or use static channel to send + +#define DEFAULT_RECV_CHANNEL 3 +#define SPI_SPEED 1000000 + +#define DTU_RADIO_ID ((uint64_t)0x1234567801ULL) +#define DUMMY_RADIO_ID ((uint64_t)0xDEADBEEF01ULL) + +#define RX_LOOP_CNT 400 + +const char* const rf24AmpPower[] = {"MIN", "LOW", "HIGH", "MAX"}; + + + +//----------------------------------------------------------------------------- +// MACROS +//----------------------------------------------------------------------------- +#define CP_U32_LittleEndian(buf, v) ({ \ + uint8_t *b = buf; \ + b[0] = ((v >> 24) & 0xff); \ + b[1] = ((v >> 16) & 0xff); \ + b[2] = ((v >> 8) & 0xff); \ + b[3] = ((v ) & 0xff); \ +}) + +#define CP_U32_BigEndian(buf, v) ({ \ + uint8_t *b = buf; \ + b[3] = ((v >> 24) & 0xff); \ + b[2] = ((v >> 16) & 0xff); \ + b[1] = ((v >> 8) & 0xff); \ + b[0] = ((v ) & 0xff); \ +}) + +#define BIT_CNT(x) ((x)<<3) + + +//----------------------------------------------------------------------------- +// HM Radio class +//----------------------------------------------------------------------------- +template +class HmRadio { + public: + HmRadio() : mNrf24(CE_PIN, CS_PIN, SPI_SPEED) { + mTxChLst[0] = 40; + //mTxChIdx = 1; + + mRxChLst[0] = 3; + mRxChLst[1] = 23; + mRxChLst[2] = 61; + mRxChLst[3] = 75; + mRxChIdx = 0; + mRxLoopCnt = RX_LOOP_CNT; + + //calcDtuCrc(); + + pinCs = CS_PIN; + pinCe = CE_PIN; + pinIrq = IRQ_PIN; + + AmplifierPower = 1; + mSendCnt = 0; + } + ~HmRadio() {} + + void setup(BUFFER *ctrl) { + pinMode(pinIrq, INPUT_PULLUP); + + mBufCtrl = ctrl; + + mNrf24.begin(pinCe, pinCs); + mNrf24.setRetries(0, 0); + + mNrf24.setChannel(DEFAULT_RECV_CHANNEL); + mNrf24.setDataRate(RF24_250KBPS); + mNrf24.disableCRC(); + mNrf24.setAutoAck(false); + mNrf24.setPayloadSize(MAX_RF_PAYLOAD_SIZE); + mNrf24.setAddressWidth(5); + mNrf24.openReadingPipe(1, DTU_RADIO_ID); + + // enable only receiving interrupts + mNrf24.maskIRQ(true, true, false); + + DPRINTLN("RF24 Amp Pwr: RF24_PA_" + String(rf24AmpPower[AmplifierPower])); + mNrf24.setPALevel(AmplifierPower & 0x03); + mNrf24.startListening(); + + DPRINTLN("Radio Config:"); + mNrf24.printPrettyDetails(); + + mTxCh = getDefaultChannel(); + + if(!mNrf24.isChipConnected()) { + DPRINTLN("WARNING! your NRF24 module can't be reached, check the wiring"); + } + } + + void handleIntr(void) { + uint8_t pipe, len; + packet_t *p; + + DISABLE_IRQ; + while(mNrf24.available(&pipe)) { + if(!mBufCtrl->full()) { + p = mBufCtrl->getFront(); + memset(p->packet, 0xcc, MAX_RF_PAYLOAD_SIZE); + p->rxCh = mRxChIdx; + len = mNrf24.getPayloadSize(); + if(len > MAX_RF_PAYLOAD_SIZE) + len = MAX_RF_PAYLOAD_SIZE; + + mNrf24.read(p->packet, len); + mBufCtrl->pushFront(p); + } + else { + bool tx_ok, tx_fail, rx_ready; + mNrf24.whatHappened(tx_ok, tx_fail, rx_ready); // reset interrupt status + mNrf24.flush_rx(); // drop the packet + } + } + RESTORE_IRQ; + } + + uint8_t getDefaultChannel(void) { + return mTxChLst[0]; + } + /*uint8_t getLastChannel(void) { + return mTxChLst[mTxChIdx]; + } + + uint8_t getNxtChannel(void) { + if(++mTxChIdx >= 4) + mTxChIdx = 0; + return mTxChLst[mTxChIdx]; + }*/ + + void sendTimePacket(uint64_t invId, uint32_t ts) { + sendCmdPacket(invId, 0x15, 0x80, false); + mTxBuf[10] = 0x0b; // cid + mTxBuf[11] = 0x00; + CP_U32_LittleEndian(&mTxBuf[12], ts); + mTxBuf[19] = 0x05; + + uint16_t crc = crc16(&mTxBuf[10], 14); + mTxBuf[24] = (crc >> 8) & 0xff; + mTxBuf[25] = (crc ) & 0xff; + mTxBuf[26] = crc8(mTxBuf, 26); + + sendPacket(invId, mTxBuf, 27, true); + } + + void sendCmdPacket(uint64_t invId, uint8_t mid, uint8_t cmd, bool calcCrc = true) { + memset(mTxBuf, 0, MAX_RF_PAYLOAD_SIZE); + mTxBuf[0] = mid; // message id + CP_U32_BigEndian(&mTxBuf[1], (invId >> 8)); + CP_U32_BigEndian(&mTxBuf[5], (DTU_ID >> 8)); + mTxBuf[9] = cmd; + if(calcCrc) { + mTxBuf[10] = crc8(mTxBuf, 10); + sendPacket(invId, mTxBuf, 11, false); + } + } + + bool checkPaketCrc(uint8_t buf[], uint8_t *len, uint8_t *rptCnt, uint8_t rxCh) { + *len = (buf[0] >> 2); + if(*len > (MAX_RF_PAYLOAD_SIZE - 2)) + *len = MAX_RF_PAYLOAD_SIZE - 2; + for(uint8_t i = 1; i < (*len + 1); i++) { + buf[i-1] = (buf[i] << 1) | (buf[i+1] >> 7); + } + + uint8_t crc = crc8(buf, *len-1); + bool valid = (crc == buf[*len-1]); + + if(valid) { + if(mLastCrc == crc) + *rptCnt = (++mRptCnt); + else { + mRptCnt = 0; + *rptCnt = 0; + mLastCrc = crc; + } + mRxStat[(buf[9] & 0x7F)-1]++; + mRxChStat[(buf[9] & 0x7F)-1][rxCh & 0x7]++; + } + /*else { + DPRINT("CRC wrong: "); + DHEX(crc); + DPRINT(" != "); + DHEX(buf[*len-1]); + DPRINTLN(""); + }*/ + + return valid; + } + + bool switchRxCh(uint8_t addLoop = 0) { + mRxLoopCnt += addLoop; + if(mRxLoopCnt != 0) { + mRxLoopCnt--; + DISABLE_IRQ; + mNrf24.stopListening(); + mNrf24.setChannel(getRxNxtChannel()); + mNrf24.startListening(); + RESTORE_IRQ; + } + return (0 == mRxLoopCnt); // receive finished + } + + void dumpBuf(const char *info, uint8_t buf[], uint8_t len) { + DPRINT(String(info)); + for(uint8_t i = 0; i < len; i++) { + DHEX(buf[i]); + DPRINT(" "); + } + DPRINTLN(""); + } + + bool isChipConnected(void) { + return mNrf24.isChipConnected(); + } + + uint8_t pinCs; + uint8_t pinCe; + uint8_t pinIrq; + + uint8_t AmplifierPower; + uint32_t mSendCnt; + + private: + void sendPacket(uint64_t invId, uint8_t buf[], uint8_t len, bool clear=false) { + //DPRINTLN("sent packet: #" + String(mSendCnt)); + //dumpBuf("SEN ", buf, len); + + DISABLE_IRQ; + mNrf24.stopListening(); + + if(clear) { + uint8_t cnt = 4; + for(uint8_t i = 0; i < 4; i ++) { + DPRINT(String(mRxStat[i]) + " ("); + for(uint8_t j = 0; j < 4; j++) { + DPRINT(String(mRxChStat[i][j])); + } + DPRINT(") "); + if(0 != mRxStat[i]) + cnt--; + } + if(cnt == 0) + DPRINTLN(" -> all"); + else + DPRINTLN(" -> missing: " + String(cnt)); + memset(mRxStat, 0, 4); + memset(mRxChStat, 0, 4*8); + mRxLoopCnt = RX_LOOP_CNT; + } + + mTxCh = getDefaultChannel(); + mNrf24.setChannel(mTxCh); + + mNrf24.openWritingPipe(invId); // TODO: deprecated + mNrf24.setCRCLength(RF24_CRC_16); + mNrf24.enableDynamicPayloads(); + mNrf24.setAutoAck(true); + mNrf24.setRetries(3, 15); // 3*250us and 15 loops -> 11.25ms + + mNrf24.write(buf, len); + + // Try to avoid zero payload acks (has no effect) + mNrf24.openWritingPipe(DUMMY_RADIO_ID); // TODO: why dummy radio id?, deprecated + + mNrf24.setAutoAck(false); + mNrf24.setRetries(0, 0); + mNrf24.disableDynamicPayloads(); + mNrf24.setCRCLength(RF24_CRC_DISABLED); + + mRxChIdx = 0; + mNrf24.setChannel(mRxChLst[mRxChIdx]); + mNrf24.startListening(); + + RESTORE_IRQ; + mSendCnt++; + } + + uint8_t getRxNxtChannel(void) { + if(++mRxChIdx >= 4) + mRxChIdx = 0; + return mRxChLst[mRxChIdx]; + } + + /*void calcDtuCrc(void) { + uint64_t addr = DTU_RADIO_ID; + uint8_t tmp[5]; + for(int8_t i = 4; i >= 0; i--) { + tmp[i] = addr; + addr >>= 8; + } + mDtuIdCrc = crc16nrf24(tmp, BIT_CNT(5)); + }*/ + + uint8_t mTxCh; + uint8_t mTxChLst[1]; + //uint8_t mTxChIdx; + + uint8_t mRxChLst[4]; + uint8_t mRxChIdx; + uint8_t mRxStat[4]; + uint8_t mRxChStat[4][8]; + uint16_t mRxLoopCnt; + + //uint16_t mDtuIdCrc; + uint16_t mLastCrc; + uint8_t mRptCnt; + + RF24 mNrf24; + BUFFER *mBufCtrl; + uint8_t mTxBuf[MAX_RF_PAYLOAD_SIZE]; + +}; + +#endif /*__RADIO_H__*/ diff --git a/tools/esp8266/hmSystem.h b/tools/esp8266/hmSystem.h new file mode 100644 index 00000000..c418fb08 --- /dev/null +++ b/tools/esp8266/hmSystem.h @@ -0,0 +1,82 @@ +#ifndef __HM_SYSTEM_H__ +#define __HM_SYSTEM_H__ + +#include "hmInverter.h" +#ifndef NO_RADIO +#include "hmRadio.h" +#endif + + + +template > +class HmSystem { + public: + typedef RADIO RadioType; + RadioType Radio; + typedef BUFFER BufferType; + BufferType BufCtrl; + + HmSystem() { + mNumInv = 0; + } + ~HmSystem() { + // TODO: cleanup + } + + void setup() { + Radio.setup(&BufCtrl); + } + + INVERTERTYPE *addInverter(const char *name, uint64_t serial, uint8_t type) { + if(MAX_INVERTER <= mNumInv) { + DPRINT("max number of inverters reached!"); + return NULL; + } + INVERTERTYPE *p = &mInverter[mNumInv]; + p->id = mNumInv; + p->serial.u64 = serial; + p->type = type; + p->init(); + uint8_t len = (uint8_t)strlen(name); + strncpy(p->name, name, (len > MAX_NAME_LENGTH) ? MAX_NAME_LENGTH : len); + + if(NULL == p->assign) { + DPRINT("no assignment for type found!"); + return NULL; + } + else { + mNumInv ++; + return p; + } + } + + INVERTERTYPE *findInverter(uint8_t buf[]) { + INVERTERTYPE *p; + for(uint8_t i = 0; i < mNumInv; i++) { + p = &mInverter[i]; + if((p->serial.b[3] == buf[0]) + && (p->serial.b[2] == buf[1]) + && (p->serial.b[1] == buf[2]) + && (p->serial.b[0] == buf[3])) + return p; + } + return NULL; + } + + INVERTERTYPE *getInverterByPos(uint8_t pos) { + if(mInverter[pos].serial.u64 != 0ULL) + return &mInverter[pos]; + else + return NULL; + } + + uint8_t getNumInverters(void) { + return mNumInv; + } + + private: + INVERTERTYPE mInverter[MAX_INVERTER]; + uint8_t mNumInv; +}; + +#endif /*__HM_SYSTEM_H__*/ diff --git a/tools/esp8266/hoymiles.h b/tools/esp8266/hoymiles.h deleted file mode 100644 index 66b80c3c..00000000 --- a/tools/esp8266/hoymiles.h +++ /dev/null @@ -1,178 +0,0 @@ -#ifndef __HOYMILES_H__ -#define __HOYMILES_H__ - -#include -#include -#include "crc.h" - -#define CHANNEL_HOP // switch between channels or use static channel to send - -#define luint64_t long long unsigned int - -#define DEFAULT_RECV_CHANNEL 3 -#define MAX_RF_PAYLOAD_SIZE 32 -#define DTU_RADIO_ID ((uint64_t)0x1234567801ULL) -#define DUMMY_RADIO_ID ((uint64_t)0xDEADBEEF01ULL) - -#define PACKET_BUFFER_SIZE 30 - - -//----------------------------------------------------------------------------- -// MACROS -#define CP_U32_LittleEndian(buf, v) ({ \ - uint8_t *b = buf; \ - b[0] = ((v >> 24) & 0xff); \ - b[1] = ((v >> 16) & 0xff); \ - b[2] = ((v >> 8) & 0xff); \ - b[3] = ((v ) & 0xff); \ -}) - -#define CP_U32_BigEndian(buf, v) ({ \ - uint8_t *b = buf; \ - b[3] = ((v >> 24) & 0xff); \ - b[2] = ((v >> 16) & 0xff); \ - b[1] = ((v >> 8) & 0xff); \ - b[0] = ((v ) & 0xff); \ -}) - -#define BIT_CNT(x) ((x)<<3) - - -//----------------------------------------------------------------------------- -union uint64Bytes { - uint64_t ull; - uint8_t bytes[8]; -}; - -typedef struct { - uint8_t sendCh; - uint8_t packet[MAX_RF_PAYLOAD_SIZE]; -} NRF24_packet_t; - - -//----------------------------------------------------------------------------- -class hoymiles { - public: - hoymiles() { - serial2RadioId(); - calcDtuIdCrc(); - - mChannels[0] = 23; - mChannels[1] = 40; - mChannels[2] = 61; - mChannels[3] = 75; - mChanIdx = 1; - - mLastCrc = 0x0000; - mRptCnt = 0; - } - - ~hoymiles() {} - - uint8_t getDefaultChannel(void) { - return mChannels[2]; - } - uint8_t getLastChannel(void) { - return mChannels[mChanIdx]; - } - - uint8_t getNxtChannel(void) { - if(++mChanIdx >= 4) - mChanIdx = 0; - return mChannels[mChanIdx]; - } - - void serial2RadioId(void) { - uint64Bytes id; - - id.ull = 0ULL; - id.bytes[4] = mAddrBytes[5]; - id.bytes[3] = mAddrBytes[4]; - id.bytes[2] = mAddrBytes[3]; - id.bytes[1] = mAddrBytes[2]; - id.bytes[0] = 0x01; - - mRadioId = id.ull; - } - - uint8_t getTimePacket(uint8_t buf[], uint32_t ts) { - getCmdPacket(buf, 0x15, 0x80, false); - buf[10] = 0x0b; // cid - buf[11] = 0x00; - CP_U32_LittleEndian(&buf[12], ts); - buf[19] = 0x05; - - uint16_t crc = crc16(&buf[10], 14); - buf[24] = (crc >> 8) & 0xff; - buf[25] = (crc ) & 0xff; - buf[26] = crc8(buf, 26); - - return 27; - } - - uint8_t getCmdPacket(uint8_t buf[], uint8_t mid, uint8_t cmd, bool calcCrc = true) { - memset(buf, 0, MAX_RF_PAYLOAD_SIZE); - buf[0] = mid; // message id - CP_U32_BigEndian(&buf[1], (mRadioId >> 8)); - CP_U32_BigEndian(&buf[5], (DTU_RADIO_ID >> 8)); - buf[9] = cmd; - if(calcCrc) - buf[10] = crc8(buf, 10); - - return 11; - } - - bool checkCrc(uint8_t buf[], uint8_t *len, uint8_t *rptCnt) { - *len = (buf[0] >> 2); - for (int16_t i = MAX_RF_PAYLOAD_SIZE - 1; i >= 0; i--) { - buf[i] = ((buf[i] >> 7) | ((i > 0) ? (buf[i-1] << 1) : 0x00)); - } - uint16_t crc = crc16nrf24(buf, BIT_CNT(*len + 2), 7, mDtuIdCrc); - - bool valid = (crc == ((buf[*len+2] << 8) | (buf[*len+3]))); - - if(valid) { - if(mLastCrc == crc) - *rptCnt = (++mRptCnt); - else { - mRptCnt = 0; - *rptCnt = 0; - mLastCrc = crc; - } - } - - return valid; - } - - void dumpBuf(const char *info, uint8_t buf[], uint8_t len) { - Serial.print(String(info)); - for(uint8_t i = 0; i < len; i++) { - Serial.print(buf[i], HEX); - Serial.print(" "); - } - Serial.println(); - } - - uint8_t mAddrBytes[6]; - luint64_t mRadioId; - - private: - void calcDtuIdCrc(void) { - uint64_t addr = DTU_RADIO_ID; - uint8_t dtuAddr[5]; - for(int8_t i = 4; i >= 0; i--) { - dtuAddr[i] = addr; - addr >>= 8; - } - mDtuIdCrc = crc16nrf24(dtuAddr, BIT_CNT(5)); - } - - - uint8_t mChannels[4]; - uint8_t mChanIdx; - uint16_t mDtuIdCrc; - uint16_t mLastCrc; - uint8_t mRptCnt; -}; - -#endif /*__HOYMILES_H__*/ diff --git a/tools/esp8266/html/conv.bat b/tools/esp8266/html/conv.bat deleted file mode 100644 index 46587400..00000000 --- a/tools/esp8266/html/conv.bat +++ /dev/null @@ -1,4 +0,0 @@ -..\tools\fileConv.exe index.html h\index_html.h index_html -..\tools\fileConv.exe setup.html h\setup_html.h setup_html -..\tools\fileConv.exe style.css h\style_css.h style_css -pause diff --git a/tools/esp8266/html/convert.py b/tools/esp8266/html/convert.py new file mode 100644 index 00000000..8171b69e --- /dev/null +++ b/tools/esp8266/html/convert.py @@ -0,0 +1,29 @@ +import re + +def convert2Header(inFile): + outName = "h/" + inFile.replace(".", "_") + ".h" + fileType = inFile.split(".")[1] + + f = open(inFile, "r") + data = f.read().replace('\n', '') + f.close() + if fileType == "html": + data = re.sub(r"\>\s+\<", '><', data) # whitespaces between xml tags + data = re.sub(r"(\;|\}|\>|\{)\s+", r'\1', data) # whitespaces inner javascript + data = re.sub(r"\"", '\\\"', data) # escape quotation marks + else: + data = re.sub(r"(\;|\}|\:|\{)\s+", r'\1', data) # whitespaces inner css + + define = inFile.split(".")[0].upper() + define2 = inFile.split(".")[1].upper() + f = open(outName, "w") + f.write("#ifndef __{}_{}_H__\n".format(define, define2)) + f.write("#define __{}_{}_H__\n".format(define, define2)) + f.write("const char {}[] PROGMEM = \"{}\";\n".format(inFile.replace(".", "_"), data)) + f.write("#endif /*__{}_{}_H__*/\n".format(define, define2)) + f.close() + +convert2Header("index.html") +convert2Header("setup.html") +convert2Header("hoymiles.html") +convert2Header("style.css") diff --git a/tools/esp8266/html/h/hoymiles_html.h b/tools/esp8266/html/h/hoymiles_html.h new file mode 100644 index 00000000..5e3a43e1 --- /dev/null +++ b/tools/esp8266/html/h/hoymiles_html.h @@ -0,0 +1,4 @@ +#ifndef __HOYMILES_HTML_H__ +#define __HOYMILES_HTML_H__ +const char hoymiles_html[] PROGMEM = "Index - {DEVICE}

AHOY - {DEVICE}

Every 10 seconds the values are updated

© 2022

Home

AHOY :: {VERSION}

"; +#endif /*__HOYMILES_HTML_H__*/ diff --git a/tools/esp8266/html/h/index_html.h b/tools/esp8266/html/h/index_html.h index 8c2921e0..c75e9d64 100644 --- a/tools/esp8266/html/h/index_html.h +++ b/tools/esp8266/html/h/index_html.h @@ -1 +1,4 @@ -String index_html = "Index - {DEVICE}

AHOY - {DEVICE}

Update

Setup
Reboot

Uptime:

Time:

Statistics:

© 2022

AHOY :: {VERSION}

"; +#ifndef __INDEX_HTML_H__ +#define __INDEX_HTML_H__ +const char index_html[] PROGMEM = "Index - {DEVICE}

AHOY - {DEVICE}

Visualization

Setup

Uptime:

Time:

Statistics:

This project was started from this discussion. (Mikrocontroller.net)
New updates can be found on Github: https://github.com/grindylow/ahoy

Please report issues using the feature provided by Github.

© 2022

Update Firmware

AHOY :: {VERSION}

Reboot

"; +#endif /*__INDEX_HTML_H__*/ diff --git a/tools/esp8266/html/h/setup_html.h b/tools/esp8266/html/h/setup_html.h index 24440e88..49f8e9c3 100644 --- a/tools/esp8266/html/h/setup_html.h +++ b/tools/esp8266/html/h/setup_html.h @@ -1 +1,4 @@ -String setup_html = "Setup - {DEVICE}

Setup

Enter the credentials to your prefered WiFi station. After rebooting the device tries to connect with this information.

WiFi

SSID
PASSWORD

Device Host Name

DEVICE NAME

General

HOYMILES ADDRESS (eg. 11:22:33:44:55:66)

Home

Update Firmware

AHOY - {VERSION}

"; +#ifndef __SETUP_HTML_H__ +#define __SETUP_HTML_H__ +const char setup_html[] PROGMEM = "Setup - {DEVICE}

Setup

Enter the credentials to your prefered WiFi station. After rebooting the device tries to connect with this information.

WiFi

Device Host Name

ERASE SETTINGS (not WiFi)

Inverter

{INVERTERS}

General

Pinout (Wemos)

{PINOUT}

Radio (NRF24L01+)

MQTT

Serial Console



 

"; +#endif /*__SETUP_HTML_H__*/ diff --git a/tools/esp8266/html/h/style_css.h b/tools/esp8266/html/h/style_css.h index be1e0761..b64ceeb6 100644 --- a/tools/esp8266/html/h/style_css.h +++ b/tools/esp8266/html/h/style_css.h @@ -1 +1,4 @@ -String style_css = "h1 { margin: 0; padding: 20pt; font-size: 22pt; color: #fff; background-color: #006ec0; display: block; text-transform: uppercase; } html, body { font-family: Arial; margin: 0; padding: 0; } p { text-align: justify; font-size: 13pt; } .des { font-size: 14pt; color: #006ec0; padding-bottom: 0px !important; } .fw { width: 60px; display: block; float: left; } .color { width: 50px; height: 50px; border: 1px solid #ccc; } .range { width: 300px; } a:link, a:visited { text-decoration: none; font-size: 13pt; color: #006ec0; } a:hover, a:focus { color: #f00; } #content { padding: 15px 15px 60px 15px; } #footer { position: fixed; bottom: 0px; height: 45px; background-color: #006ec0; width: 100%; } #footer p { color: #fff; padding-left: 20px; padding-right: 20px; font-size: 10pt !important; } #footer a { color: #fff; } #footer a:hover { color: #f00; } div.content { background-color: #fff; padding-bottom: 65px; overflow: hidden; } span.warn { display: inline-block; padding-left: 20px; color: #ff9900; font-style: italic; } input { padding: 10px; font-size: 13pt; } input.button { background-color: #006ec0; color: #fff; border: 0px; float: right; text-transform: uppercase; } input.cb { margin-bottom: 20px; } label { font-size: 14pt; } .left { float: left; } .right { float: right; } .inputWrp { position: relative; } .inputWrp .inputText { height: 35px; width: 90%; margin-bottom: 20px; border: 1px solid #ccc; border-top: none; border-right: none; } .inputWrp .floating_label { position: absolute; pointer-events: none; top: 20px; left: 10px; transition: 0.2s ease all; } .inputWrp input:focus ~ .floating_label, .inputWrp input:not(:focus):valid ~ .floating_label { top: 0px; left: 20px; font-size: 10px; color: blue; opacity: 1; } "; +#ifndef __STYLE_CSS_H__ +#define __STYLE_CSS_H__ +const char style_css[] PROGMEM = "h1 {margin:0;padding:20pt;font-size:22pt;color:#fff;background-color:#006ec0;display:block;text-transform:uppercase;}html, body {font-family:Arial;margin:0;padding:0;}p {text-align:justify;font-size:13pt;}.des {margin-top:35px;font-size:13pt;color:#006ec0;}.subdes {font-size:12pt;color:#006ec0;margin-left:7px;}a:link, a:visited {text-decoration:none;font-size:13pt;color:#006ec0;}a:hover, a:focus {color:#f00;}a.erase {background-color:#006ec0;color:#fff;padding:7px;display:inline-block;margin-top:30px;float:right;}#content {padding:15px 15px 60px 15px;}#footer {position:fixed;bottom:0px;height:45px;background-color:#006ec0;width:100%;border-top:5px solid #fff;}#footer p, #footer a {color:#fff;padding:0 7px 0 7px;font-size:10pt !important;}div.content {background-color:#fff;padding-bottom:65px;overflow:auto;}input, select {padding:7px;font-size:13pt;}input.text, select {width:70%;box-sizing:border-box;margin-bottom:10px;border:1px solid #ccc;}input.btn {background-color:#006ec0;color:#fff;border:0px;float:right;margin:10px 0 30px;text-transform:uppercase;}input.cb {margin-bottom:20px;}label {width:20%;display:inline-block;font-size:12pt;padding-right:10px;margin-left:10px;}.left {float:left;}.right {float:right;}div.ch-iv {width:100%;background-color:#32b004;display:inline-block;margin-bottom:20px;padding-bottom:20px;overflow:auto;}div.ch {width:250px;min-height:420px;background-color:#006ec0;display:inline-block;margin-right:20px;margin-bottom:20px;overflow:auto;padding-bottom:20px;}div.ch .value, div.ch .info, div.ch .head, div.ch-iv .value, div.ch-iv .info, div.ch-iv .head {color:#fff;display:block;width:100%;text-align:center;}.subgrp {float:left;width:250px;}div.ch .unit, div.ch-iv .unit {font-size:19px;margin-left:10px;}div.ch .value, div.ch-iv .value {margin-top:20px;font-size:30px;}div.ch .info, div.ch-iv .info {margin-top:3px;font-size:10px;}div.ch .head {background-color:#003c80;padding:10px 0 10px 0;}div.ch-iv .head {background-color:#1c6800;padding:10px 0 10px 0;}div.iv {max-width:1060px;}div.ch:last-child {margin-right:0px !important;}#note {margin:50px 10px 10px 10px;padding-top:10px;width:100%;border-top:1px solid #bbb;}"; +#endif /*__STYLE_CSS_H__*/ diff --git a/tools/esp8266/html/hoymiles.html b/tools/esp8266/html/hoymiles.html new file mode 100644 index 00000000..3f4a6256 --- /dev/null +++ b/tools/esp8266/html/hoymiles.html @@ -0,0 +1,42 @@ + + + + Index - {DEVICE} + + + + + + +

AHOY - {DEVICE}

+
+
+

Every 10 seconds the values are updated

+
+ + + diff --git a/tools/esp8266/html/index.html b/tools/esp8266/html/index.html index 2cd0b1b6..541caeb1 100644 --- a/tools/esp8266/html/index.html +++ b/tools/esp8266/html/index.html @@ -30,18 +30,26 @@

AHOY - {DEVICE}

- Update
+ Visualization

Setup
- Reboot

Uptime:

Time:

Statistics:

+ +
+ This project was started from this discussion. (Mikrocontroller.net)
+ New updates can be found on Github: https://github.com/grindylow/ahoy
+
+ Please report issues using the feature provided by Github. +
diff --git a/tools/esp8266/html/setup.html b/tools/esp8266/html/setup.html index 393fce78..0d61eb6f 100644 --- a/tools/esp8266/html/setup.html +++ b/tools/esp8266/html/setup.html @@ -12,40 +12,68 @@

Enter the credentials to your prefered WiFi station. After rebooting the device tries to connect with this information.

-
+

WiFi

-
- - SSID -
-
- - PASSWORD -
+ + + +

Device Host Name

-
- - DEVICE NAME -
+ + -

General

-
- - HOYMILES ADDRESS (eg. 11:22:33:44:55:66) -
- - + ERASE SETTINGS (not WiFi) + +

Inverter

+ {INVERTERS}
+

General

+ + + +

Pinout (Wemos)

+ {PINOUT} + +

Radio (NRF24L01+)

+ + - +

MQTT

+ + + + + + + + + + + + + +

Serial Console

+ +
+ +
+ + + +

 

+ + +
diff --git a/tools/esp8266/html/style.css b/tools/esp8266/html/style.css index 7d6daaa7..89d8db7f 100644 --- a/tools/esp8266/html/style.css +++ b/tools/esp8266/html/style.css @@ -20,26 +20,17 @@ p { } .des { - font-size: 14pt; + margin-top: 35px; + font-size: 13pt; color: #006ec0; - padding-bottom: 0px !important; } -.fw { - width: 60px; - display: block; - float: left; +.subdes { + font-size: 12pt; + color: #006ec0; + margin-left: 7px; } -.color { - width: 50px; - height: 50px; - border: 1px solid #ccc; -} - -.range { - width: 300px; -} a:link, a:visited { text-decoration: none; @@ -51,6 +42,15 @@ a:hover, a:focus { color: #f00; } +a.erase { + background-color: #006ec0; + color: #fff; + padding: 7px; + display: inline-block; + margin-top: 30px; + float: right; +} + #content { padding: 15px 15px 60px 15px; } @@ -61,46 +61,39 @@ a:hover, a:focus { height: 45px; background-color: #006ec0; width: 100%; + border-top: 5px solid #fff; } -#footer p { +#footer p, #footer a { color: #fff; - padding-left: 20px; - padding-right: 20px; + padding: 0 7px 0 7px; font-size: 10pt !important; } -#footer a { - color: #fff; -} - -#footer a:hover { - color: #f00; -} - div.content { background-color: #fff; padding-bottom: 65px; - overflow: hidden; + overflow: auto; } -span.warn { - display: inline-block; - padding-left: 20px; - color: #ff9900; - font-style: italic; +input, select { + padding: 7px; + font-size: 13pt; } -input { - padding: 10px; - font-size: 13pt; +input.text, select { + width: 70%; + box-sizing: border-box; + margin-bottom: 10px; + border: 1px solid #ccc; } -input.button { +input.btn { background-color: #006ec0; color: #fff; border: 0px; float: right; + margin: 10px 0 30px; text-transform: uppercase; } @@ -109,7 +102,11 @@ input.cb { } label { - font-size: 14pt; + width: 20%; + display: inline-block; + font-size: 12pt; + padding-right: 10px; + margin-left: 10px; } .left { @@ -120,32 +117,74 @@ label { float: right; } -.inputWrp { - position: relative; +div.ch-iv { + width: 100%; + background-color: #32b004; + display: inline-block; + margin-bottom: 20px; + padding-bottom: 20px; + overflow: auto; } -.inputWrp .inputText { - height: 35px; - width: 90%; +div.ch { + width: 250px; + min-height: 420px; + background-color: #006ec0; + display: inline-block; + margin-right: 20px; margin-bottom: 20px; - border: 1px solid #ccc; - border-top: none; - border-right: none; + overflow: auto; + padding-bottom: 20px; +} + +div.ch .value, div.ch .info, div.ch .head, div.ch-iv .value, div.ch-iv .info, div.ch-iv .head { + color: #fff; + display: block; + width: 100%; + text-align: center; +} + +.subgrp { + float: left; + width: 250px; } -.inputWrp .floating_label { - position: absolute; - pointer-events: none; - top: 20px; - left: 10px; - transition: 0.2s ease all; +div.ch .unit, div.ch-iv .unit { + font-size: 19px; + margin-left: 10px; } -.inputWrp input:focus ~ .floating_label, -.inputWrp input:not(:focus):valid ~ .floating_label { - top: 0px; - left: 20px; - font-size: 10px; - color: blue; - opacity: 1; +div.ch .value, div.ch-iv .value { + margin-top: 20px; + font-size: 30px; +} + +div.ch .info, div.ch-iv .info { + margin-top: 3px; + font-size: 10px; +} + +div.ch .head { + background-color: #003c80; + padding: 10px 0 10px 0; +} + +div.ch-iv .head { + background-color: #1c6800; + padding: 10px 0 10px 0; +} + +div.iv { + max-width: 1060px; +} + +div.ch:last-child { + margin-right: 0px !important; +} + +#note { + margin: 50px 10px 10px 10px; + padding-top: 10px; + width: 100%; + border-top: 1px solid #bbb; } diff --git a/tools/esp8266/main.cpp b/tools/esp8266/main.cpp index 1f48531e..c2fac10e 100644 --- a/tools/esp8266/main.cpp +++ b/tools/esp8266/main.cpp @@ -12,8 +12,13 @@ Main::Main(void) { mUpdater = new ESP8266HTTPUpdateServer(); mUdp = new WiFiUDP(); - mApActive = true; - mSettingsValid = false; + mApActive = true; + mWifiSettingsValid = false; + mSettingsValid = false; + + mLimit = 10; + mNextTryTs = 0; + mApLastTick = 0; snprintf(mVersion, 12, "%d.%d.%d", VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH); @@ -22,82 +27,105 @@ Main::Main(void) { mEep = new eep(); Serial.begin(115200); - mUptimeSecs = 0; - mUptimeTicker = new Ticker(); - mUptimeTicker->attach(1, std::bind(&Main::uptimeTicker, this)); - + mUptimeSecs = 0; + mUptimeTicker = 0xffffffff; + mUptimeInterval = 1000; } //----------------------------------------------------------------------------- -void Main::setup(const char *ssid, const char *pwd, uint32_t timeout) { +void Main::setup(uint32_t timeout) { bool startAp = mApActive; + mLimit = timeout; - mWeb->on("/setup", std::bind(&Main::showSetup, this)); - mWeb->on("/save", std::bind(&Main::showSave, this)); - mWeb->on("/uptime", std::bind(&Main::showUptime, this)); - mWeb->on("/time", std::bind(&Main::showTime, this)); - mWeb->on("/style.css", std::bind(&Main::showCss, this)); - mWeb->on("/reboot", std::bind(&Main::showReboot, this)); - mWeb->onNotFound (std::bind(&Main::showNotFound, this)); + mWeb->on("/setup", std::bind(&Main::showSetup, this)); + mWeb->on("/save", std::bind(&Main::showSave, this)); + mWeb->on("/uptime", std::bind(&Main::showUptime, this)); + mWeb->on("/time", std::bind(&Main::showTime, this)); + mWeb->on("/style.css", std::bind(&Main::showCss, this)); + mWeb->on("/reboot", std::bind(&Main::showReboot, this)); + mWeb->on("/factory", std::bind(&Main::showFactoryRst, this)); + mWeb->onNotFound ( std::bind(&Main::showNotFound, this)); startAp = getConfig(); - if(String(mDeviceName) != "") - WiFi.hostname(mDeviceName); +#ifndef AP_ONLY if(false == startAp) startAp = setupStation(timeout); - - if(true == startAp) { - if(strlen(pwd) < 8) - Serial.println("password must be at least 8 characters long"); - setupAp(ssid, pwd); +#else + setupAp(WIFI_AP_SSID, WIFI_AP_PWD); +#endif + + if(!startAp) { + delay(5000); + mTimestamp = getNtpTime(); + DPRINTLN("[NTP]: " + getDateTimeStr(getNtpTime())); } mUpdater->setup(mWeb); - mApActive = startAp; - - mTimestamp = getNtpTime(); - //Serial.println("[NTP]: " + getDateTimeStr(getNtpTime())); } //----------------------------------------------------------------------------- void Main::loop(void) { - if(mApActive) + if(mApActive) { mDns->processNextRequest(); +#ifndef AP_ONLY + if(checkTicker(&mNextTryTs, (WIFI_AP_ACTIVE_TIME * 1000))) { + mApLastTick = millis(); + mApActive = setupStation(mLimit); + if(mApActive) { + if(strlen(WIFI_AP_PWD) < 8) + DPRINTLN("ERROR: password must be at least 8 characters long"); + setupAp(WIFI_AP_SSID, WIFI_AP_PWD); + } + } + else { + if(millis() - mApLastTick > 10000) { + uint8_t cnt = WiFi.softAPgetStationNum(); + if(cnt > 0) { + DPRINTLN(String(cnt) + " clients connected, resetting AP timeout"); + mNextTryTs = (millis() + (WIFI_AP_ACTIVE_TIME * 1000)); + } + mApLastTick = millis(); + DPRINTLN("AP will be closed in " + String((mNextTryTs - mApLastTick) / 1000) + " seconds"); + } + } +#endif + } mWeb->handleClient(); + + if(checkTicker(&mUptimeTicker, mUptimeInterval)) { + mUptimeSecs++; + mTimestamp++; + } } //----------------------------------------------------------------------------- bool Main::getConfig(void) { bool mApActive = false; - uint16_t crcRd, crcCheck; - uint8_t buf[ADDR_NEXT-ADDR_START]; - - // check settings crc - mEep->read(ADDR_START, buf, (ADDR_NEXT-ADDR_START)); - crcCheck = crc16(buf, (ADDR_NEXT-ADDR_START)); - mEep->read(ADDR_SETTINGS_CRC, &crcRd); - - if(crcCheck == crcRd) - mSettingsValid = true; - //else - // Serial.println("CRC RD: " + String(crcRd, HEX) + " CRC CHECK: " + String(crcCheck, HEX)); + mWifiSettingsValid = checkEEpCrc(ADDR_START, ADDR_WIFI_CRC, ADDR_WIFI_CRC); + mSettingsValid = checkEEpCrc(ADDR_START_SETTINGS, (ADDR_NEXT-ADDR_START_SETTINGS), ADDR_SETTINGS_CRC); - if(mSettingsValid) { + if(mWifiSettingsValid) { mEep->read(ADDR_SSID, mStationSsid, SSID_LEN); mEep->read(ADDR_PWD, mStationPwd, PWD_LEN); mEep->read(ADDR_DEVNAME, mDeviceName, DEVNAME_LEN); } else { - mApActive = true; + /*mApActive = true; memset(mStationSsid, 0, SSID_LEN); memset(mStationPwd, 0, PWD_LEN); memset(mDeviceName, 0, DEVNAME_LEN); + + // erase application settings except wifi settings + eraseSettings();*/ + snprintf(mStationSsid, SSID_LEN, "%s", FB_WIFI_SSID); + snprintf(mStationPwd, PWD_LEN, "%s", FB_WIFI_PWD); + snprintf(mDeviceName, DEVNAME_LEN, "%s", DEF_DEVICE_NAME); } return mApActive; @@ -108,7 +136,12 @@ bool Main::getConfig(void) { void Main::setupAp(const char *ssid, const char *pwd) { IPAddress apIp(192, 168, 1, 1); - Serial.println("\n---------\nAP MODE\nSSDI: "+ String(ssid) + "\nPWD: " + String(pwd) + "\n---------\n"); + DPRINTLN("\n---------\nAP MODE\nSSDI: " + + String(ssid) + "\nPWD: " + + String(pwd) + "\nActive for: " + + String(WIFI_AP_ACTIVE_TIME) + " seconds" + + "\n---------\n"); + DPRINTLN("DBG: " + String(mNextTryTs)); WiFi.mode(WIFI_AP); WiFi.softAPConfig(apIp, apIp, IPAddress(255, 255, 255, 0)); @@ -127,14 +160,23 @@ void Main::setupAp(const char *ssid, const char *pwd) { //----------------------------------------------------------------------------- bool Main::setupStation(uint32_t timeout) { - int32_t cnt = timeout * 10; + int32_t cnt; bool startAp = false; + if(timeout >= 3) + cnt = (timeout - 3) / 2 * 10; + else { + timeout = 1; + cnt = 1; + } + WiFi.mode(WIFI_STA); WiFi.begin(mStationSsid, mStationPwd); + if(String(mDeviceName) != "") + WiFi.hostname(mDeviceName); - delay(5000); - Serial.println("wait for network"); + delay(2000); + DPRINTLN("connect to network '" + String(mStationSsid) + "' ..."); while (WiFi.status() != WL_CONNECTED) { delay(100); if(cnt % 100 == 0) @@ -144,8 +186,10 @@ bool Main::setupStation(uint32_t timeout) { if(timeout > 0) { // limit == 0 -> no limit if(--cnt <= 0) { - startAp = true; - WiFi.disconnect(); + if(WiFi.status() != WL_CONNECTED) { + startAp = true; + WiFi.disconnect(); + } delay(100); break; } @@ -165,12 +209,16 @@ bool Main::setupStation(uint32_t timeout) { //----------------------------------------------------------------------------- void Main::showSetup(void) { - String html = setup_html; + String html = FPSTR(setup_html); html.replace("{SSID}", mStationSsid); // PWD will be left at the default value (for protection) // -> the PWD will only be changed if it does not match the default "{PWD}" html.replace("{DEVICE}", String(mDeviceName)); html.replace("{VERSION}", String(mVersion)); + if(mApActive) + html.replace("{IP}", String("http://192.168.1.1")); + else + html.replace("{IP}", ("http://" + String(WiFi.localIP().toString()))); mWeb->send(200, "text/html", html); } @@ -178,7 +226,7 @@ void Main::showSetup(void) { //----------------------------------------------------------------------------- void Main::showCss(void) { - mWeb->send(200, "text/css", style_css); + mWeb->send(200, "text/css", FPSTR(style_css)); } @@ -212,7 +260,7 @@ void Main::saveValues(bool webSend = true) { if(webSend) { if(mWeb->arg("reboot") == "on") showReboot(); - else + else // TODO: add device name as redirect in AP-mode mWeb->send(200, "text/html", "Setup saved" "

saved

"); } @@ -223,12 +271,9 @@ void Main::saveValues(bool webSend = true) { //----------------------------------------------------------------------------- void Main::updateCrc(void) { uint16_t crc; - uint8_t buf[ADDR_NEXT-ADDR_START]; - - mEep->read(ADDR_START, buf, (ADDR_NEXT-ADDR_START)); - crc = crc16(buf, (ADDR_NEXT-ADDR_START)); + crc = buildEEpCrc(ADDR_START, ADDR_WIFI_CRC); //Serial.println("new CRC: " + String(crc, HEX)); - mEep->write(ADDR_SETTINGS_CRC, crc); + mEep->write(ADDR_WIFI_CRC, crc); } @@ -282,9 +327,30 @@ void Main::showReboot(void) { //----------------------------------------------------------------------------- -void Main::uptimeTicker(void) { - mUptimeSecs++; - mTimestamp++; +void Main::showFactoryRst(void) { + String content = ""; + int refresh = 3; + if(mWeb->args() > 0) { + if(mWeb->arg("reset").toInt() == 1) { + eraseSettings(true); + content = "factory reset: success\n\nrebooting ... "; + refresh = 10; + } + else { + content = "factory reset: aborted"; + refresh = 3; + } + } + else { + content = "

Factory Reset

"; + content += "

RESET

CANCEL

"; + refresh = 120; + } + mWeb->send(200, "text/html", "Factory Reset" + content + ""); + if(refresh == 10) { + delay(1000); + ESP.restart(); + } } diff --git a/tools/esp8266/main.h b/tools/esp8266/main.h index 1ea082c1..835a94dd 100644 --- a/tools/esp8266/main.h +++ b/tools/esp8266/main.h @@ -6,7 +6,6 @@ #include #include #include -#include #include @@ -17,6 +16,7 @@ #include "eep.h" #include "defines.h" #include "crc.h" +#include "debug.h" const byte mDnsPort = 53; @@ -30,7 +30,7 @@ const byte mDnsPort = 53; class Main { public: Main(void); - virtual void setup(const char *ssid, const char *pwd, uint32_t timeout); + virtual void setup(uint32_t timeout); virtual void loop(); String getDateTimeStr (time_t t); @@ -40,8 +40,50 @@ class Main { virtual void saveValues(bool webSend); virtual void updateCrc(void); + inline uint16_t buildEEpCrc(uint32_t start, uint32_t length) { + uint8_t buf[length]; + mEep->read(start, buf, length); + return crc16(buf, length); + } + + bool checkEEpCrc(uint32_t start, uint32_t length, uint32_t crcPos) { + uint16_t crcRd, crcCheck; + crcCheck = buildEEpCrc(start, length); + mEep->read(crcPos, &crcRd); + return (crcCheck == crcRd); + } + + void eraseSettings(bool all = false) { + uint8_t buf[64] = {0}; + uint16_t addr = (all) ? ADDR_START : ADDR_START_SETTINGS; + uint16_t end; + do { + end = addr + 64; + if(end > (ADDR_SETTINGS_CRC + 2)) + end = (ADDR_SETTINGS_CRC + 2); + DPRINTLN("erase: 0x" + String(addr, HEX) + " - 0x" + String(end, HEX)); + mEep->write(addr, buf, (end-addr)); + addr = end; + } while(addr < (ADDR_SETTINGS_CRC + 2)); + } + + inline bool checkTicker(uint32_t *ticker, uint32_t interval) { + uint32_t mil = millis(); + if(mil >= *ticker) { + *ticker = mil + interval; + return true; + } + else if(mil < (*ticker - interval)) { + *ticker = mil + interval; + return true; + } + + return false; + } + char mStationSsid[SSID_LEN]; char mStationPwd[PWD_LEN]; + bool mWifiSettingsValid; bool mSettingsValid; bool mApActive; ESP8266WebServer *mWeb; @@ -49,7 +91,9 @@ class Main { char mDeviceName[DEVNAME_LEN]; eep *mEep; uint32_t mTimestamp; - + uint32_t mLimit; + uint32_t mNextTryTs; + uint32_t mApLastTick; private: bool getConfig(void); @@ -62,14 +106,14 @@ class Main { void showUptime(void); void showTime(void); void showCss(void); - void uptimeTicker(void); - + void showFactoryRst(void); time_t getNtpTime(void); void sendNTPpacket(IPAddress& address); time_t offsetDayLightSaving (uint32_t local_t); - Ticker *mUptimeTicker; + uint32_t mUptimeTicker; + uint16_t mUptimeInterval; uint32_t mUptimeSecs; DNSServer *mDns; diff --git a/tools/esp8266/mqtt.h b/tools/esp8266/mqtt.h new file mode 100644 index 00000000..4f9bc4b7 --- /dev/null +++ b/tools/esp8266/mqtt.h @@ -0,0 +1,87 @@ +#ifndef __MQTT_H__ +#define __MQTT_H__ + +#include +#include +#include "defines.h" + +class mqtt { + public: + mqtt() { + mClient = new PubSubClient(mEspClient); + mAddressSet = false; + + memset(mUser, 0, MQTT_USER_LEN); + memset(mPwd, 0, MQTT_PWD_LEN); + memset(mTopic, 0, MQTT_TOPIC_LEN); + } + + ~mqtt() { + delete mClient; + } + + void setup(const char *broker, const char *topic, const char *user, const char *pwd, uint16_t port) { + mAddressSet = true; + mClient->setServer(broker, port); + + snprintf(mUser, MQTT_USER_LEN, "%s", user); + snprintf(mPwd, MQTT_PWD_LEN, "%s", pwd); + snprintf(mTopic, MQTT_TOPIC_LEN, "%s", topic); + } + + void sendMsg(const char *topic, const char *msg) { + if(mAddressSet) { + char top[64]; + snprintf(top, 64, "%s/%s", mTopic, topic); + + if(!mClient->connected()) + reconnect(); + mClient->publish(top, msg); + } + } + + bool isConnected(bool doRecon = false) { + if(doRecon) + reconnect(); + return mClient->connected(); + } + + char *getUser(void) { + return mUser; + } + + char *getPwd(void) { + return mPwd; + } + + char *getTopic(void) { + return mTopic; + } + + void loop() { + //if(!mClient->connected()) + // reconnect(); + mClient->loop(); + } + + private: + void reconnect(void) { + if(!mClient->connected()) { + String mqttId = "ESP-" + String(random(0xffff), HEX); + if((strlen(mUser) > 0) && (strlen(mPwd) > 0)) + mClient->connect(mqttId.c_str(), mUser, mPwd); + else + mClient->connect(mqttId.c_str()); + } + } + + WiFiClient mEspClient; + PubSubClient *mClient; + + bool mAddressSet; + char mUser[MQTT_USER_LEN]; + char mPwd[MQTT_PWD_LEN]; + char mTopic[MQTT_TOPIC_LEN]; +}; + +#endif /*__MQTT_H_*/ diff --git a/tools/esp8266/test/hmClassTest/hmClassTest.sln b/tools/esp8266/test/hmClassTest/hmClassTest.sln new file mode 100644 index 00000000..a303a142 --- /dev/null +++ b/tools/esp8266/test/hmClassTest/hmClassTest.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32002.261 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hmClassTest", "hmClassTest\hmClassTest.vcxproj", "{4D899C12-DE0E-4CDB-B48C-FDFEC331F219}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4D899C12-DE0E-4CDB-B48C-FDFEC331F219}.Debug|x64.ActiveCfg = Debug|x64 + {4D899C12-DE0E-4CDB-B48C-FDFEC331F219}.Debug|x64.Build.0 = Debug|x64 + {4D899C12-DE0E-4CDB-B48C-FDFEC331F219}.Debug|x86.ActiveCfg = Debug|Win32 + {4D899C12-DE0E-4CDB-B48C-FDFEC331F219}.Debug|x86.Build.0 = Debug|Win32 + {4D899C12-DE0E-4CDB-B48C-FDFEC331F219}.Release|x64.ActiveCfg = Release|x64 + {4D899C12-DE0E-4CDB-B48C-FDFEC331F219}.Release|x64.Build.0 = Release|x64 + {4D899C12-DE0E-4CDB-B48C-FDFEC331F219}.Release|x86.ActiveCfg = Release|Win32 + {4D899C12-DE0E-4CDB-B48C-FDFEC331F219}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {7C291F74-09F6-4C84-99E1-6E7294062385} + EndGlobalSection +EndGlobal diff --git a/tools/esp8266/test/hmClassTest/hmClassTest/hmClassTest.vcxproj b/tools/esp8266/test/hmClassTest/hmClassTest/hmClassTest.vcxproj new file mode 100644 index 00000000..bbf9cbd2 --- /dev/null +++ b/tools/esp8266/test/hmClassTest/hmClassTest/hmClassTest.vcxproj @@ -0,0 +1,147 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + 16.0 + Win32Proj + {4d899c12-de0e-4cdb-b48c-fdfec331f219} + hmClassTest + 10.0 + + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + Application + true + v142 + Unicode + + + Application + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + false + + + true + + + false + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + \ No newline at end of file diff --git a/tools/esp8266/test/hmClassTest/hmClassTest/hmClassTest.vcxproj.filters b/tools/esp8266/test/hmClassTest/hmClassTest/hmClassTest.vcxproj.filters new file mode 100644 index 00000000..fee0814f --- /dev/null +++ b/tools/esp8266/test/hmClassTest/hmClassTest/hmClassTest.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Quelldateien + + + \ No newline at end of file diff --git a/tools/esp8266/test/hmClassTest/hmClassTest/hmClassTest.vcxproj.user b/tools/esp8266/test/hmClassTest/hmClassTest/hmClassTest.vcxproj.user new file mode 100644 index 00000000..88a55094 --- /dev/null +++ b/tools/esp8266/test/hmClassTest/hmClassTest/hmClassTest.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/tools/esp8266/test/hmClassTest/src/main.cpp b/tools/esp8266/test/hmClassTest/src/main.cpp new file mode 100644 index 00000000..3b30364d --- /dev/null +++ b/tools/esp8266/test/hmClassTest/src/main.cpp @@ -0,0 +1,105 @@ +#ifdef _MSC_VER +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include +#include +#include + + +//----------------------------------------------------------------------------- +#define MAX_NUM_INVERTERS 3 +#define MAX_NAME_LENGTH 16 +#define NDEBUG +#define NO_RADIO + +#include "../../../hmDefines.h" +#include "../../../hmInverter.h" +#include "../../../hmSystem.h" + + + +//----------------------------------------------------------------------------- +typedef int RadioType; +typedef int BufferType; +typedef Inverter InverterType; +typedef HmSystem HmSystemType; + + +//----------------------------------------------------------------------------- +void valToBuf(InverterType *iv, uint8_t fld, uint8_t ch, float val, uint8_t bufPos); + + +//----------------------------------------------------------------------------- +int main(int argc, char* argv[]) { + HmSystemType sys; + InverterType *iv0, *iv1; + uint8_t buf[30] = { 0xcc }; + + iv0 = sys.addInverter("HM1200", 0x1122334455ULL, INV_TYPE_HM1200); + iv1 = sys.addInverter("HM600", 0x1234567891ULL, INV_TYPE_HM600); + + valToBuf(iv0, FLD_UDC, CH1, 29.5, 3); + valToBuf(iv0, FLD_UDC, CH3, 30.6, 9); + valToBuf(iv0, FLD_YD, CH1, 1234, 5); + valToBuf(iv0, FLD_YD, CH2, 1199, 7); + valToBuf(iv0, FLD_YD, CH3, 899, 11); + valToBuf(iv0, FLD_YD, CH4, 932, 13); + valToBuf(iv0, FLD_YT, CH1, 40.123, 13); + valToBuf(iv0, FLD_YT, CH2, 57.231, 1); + valToBuf(iv0, FLD_YT, CH3, 59.372, 3); + valToBuf(iv0, FLD_YT, CH4, 43.966, 7); + + iv0->doCalculations(); + for(uint8_t i = 0; i < iv0->listLen; i ++) { + float val = iv0->getValue(i); + if(0.0 != val) { + printf("%10s [CH%d] = %.3f %s\n", iv0->getFieldName(i), iv0->getChannel(i), val, iv0->getUnit(i)); + } + } + + return 0; +} + + +//----------------------------------------------------------------------------- +void valToBuf(InverterType *iv, uint8_t fld, uint8_t ch, float val, uint8_t bufPos) { + uint8_t buf[30] = { 0xcc }; + uint8_t len; + uint16_t factor; + + switch(fld) { + default: len = 2; break; + case FLD_YT: len = 4; break; + } + + switch(fld) { + case FLD_YD: factor = 1; break; + case FLD_UDC: + case FLD_PDC: + case FLD_UAC: + case FLD_PAC: + case FLD_PCT: + case FLD_T: factor = 10; break; + case FLD_IDC: + case FLD_IAC: + case FLD_F: factor = 100; break; + default: factor = 1000; break; + } + + uint8_t *p = &buf[bufPos]; + + uint32_t intval = (uint32_t)(val * factor); + if(2 == len) { + p[0] = (intval >> 8) & 0xff; + p[1] = (intval ) & 0xff; + } + else { + p[0] = (intval >> 24) & 0xff; + p[1] = (intval >> 16) & 0xff; + p[2] = (intval >> 8) & 0xff; + p[3] = (intval ) & 0xff; + } + iv->addValue(iv->getPosByChFld(ch, fld), buf); +} diff --git a/tools/esp8266/tools/fileConv.exe b/tools/esp8266/tools/fileConv.exe deleted file mode 100644 index 6cd3e212..00000000 Binary files a/tools/esp8266/tools/fileConv.exe and /dev/null differ diff --git a/tools/rpi/.gitignore b/tools/rpi/.gitignore new file mode 100644 index 00000000..2a1eca1d --- /dev/null +++ b/tools/rpi/.gitignore @@ -0,0 +1,11 @@ +# Python +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# Virtual Environment +venv/ + +# vim leftovers +**.swp diff --git a/tools/rpi/README.md b/tools/rpi/README.md index f7cacc81..3e5001ea 100644 --- a/tools/rpi/README.md +++ b/tools/rpi/README.md @@ -40,7 +40,54 @@ contact the inverter every second on channel 40, and listen for replies. Whenever it sees a reply, it will decoded and logged to the given log file. - $ sudo python3 ahoy.py | tee -a log2.log + $ sudo python3 -um hoymiles --log-transactions --verbose --config /home/dtu/ahoy.yml | tee -a log2.log + +Python parameters +- `-u` enables python's unbuffered mode +- `-m hoymiles` tells python to load module 'hoymiles' as main app + + +The application describes itself +``` +python -m hoymiles --help +usage: hoymiles [-h] -c [CONFIG_FILE] [--log-transactions] [--verbose] + +Ahoy - Hoymiles solar inverter gateway + +optional arguments: + -h, --help show this help message and exit + -c [CONFIG_FILE], --config-file [CONFIG_FILE] + configuration file + --log-transactions Enable transaction logging output + --verbose Enable debug output +``` + + +Inject payloads via MQTT +------------------------ + +To enable mqtt payload injection, this must be configured per inverter +```yaml +... + inverters: +... + - serial: 1147112345 + mqtt: + send_raw_enabled: true +... +``` + +This can be used to inject debug payloads +The message must be in hexlified format + +Use of variables: + * tttttttt expands to current time like we know from our `80 0b` command + +Example injects exactly the same as we normally use to poll data + + $ mosquitto_pub -h broker -t inverter_topic/command -m 800b00tttttttt0000000500000000 + +This allows for even faster hacking during runtime @@ -49,12 +96,13 @@ Analysing the Logs Use basic command line tools to get an idea what you recorded. For example: - $ cat log2.log | grep 'cmd=2' + $ cat log2.log [...] - 2022-03-28T17:36:53.018058Z MSG src=74608145, dst=74608145, cmd=2, u=235.0V, f=49.98Hz, p=2.5W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 2022-03-28T17:38:07.309501Z MSG src=74608145, dst=74608145, cmd=2, u=234.7V, f=49.99Hz, p=2.3W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 2022-03-28T17:38:24.378337Z MSG src=74608145, dst=74608145, cmd=2, u=234.7V, f=49.98Hz, p=2.2W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 2022-03-28T17:38:34.417683Z MSG src=74608145, dst=74608145, cmd=2, u=234.8V, f=49.98Hz, p=2.2W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 + 2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 + 2022-05-02 17:01:41.844361 Received 27 bytes on channel 3: 95 72 22 01 43 72 22 01 43 01 00 01 01 44 00 4e 00 fe 01 46 00 4f 01 02 00 00 6b + 2022-05-02 17:01:41.886796 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 02 8f 82 00 00 86 7a 05 fe 06 0b 08 fc 13 8a 01 e9 15 + 2022-05-02 17:01:41.934667 Received 23 bytes on channel 75: 95 72 22 01 43 72 22 01 43 83 00 00 00 15 03 e8 00 df 03 83 d5 f3 91 + 2022-05-02 17:01:41.934667 Decoded: 44 string1= 32.4VDC 0.78A 25.4W 36738Wh 1534Wh/day string2= 32.6VDC 0.79A 25.8W 34426Wh 1547Wh/day phase1= 230.0VAC 2.1A 48.9W inverter=114171230143 50.02Hz 22.3°C [...] A brief example log is supplied in the `example-logs` folder. @@ -64,9 +112,9 @@ A brief example log is supplied in the `example-logs` folder. Configuration ------------- -Nothing so far, I'm afraid. You can change the serial number of the inverter -that you are trying to talk to by changing the line that defines the -`inv_ser` variable towards the top of `ahoy.py`. +Local settings are read from ahoy.yml +An example is provided as ahoy.yml.example + Todo @@ -78,6 +126,7 @@ Todo - configurable polling interval - commands - picture of setup! +- python module - ... diff --git a/tools/rpi/ahoy.conf.example b/tools/rpi/ahoy.conf.example deleted file mode 100644 index 8aba8d0e..00000000 --- a/tools/rpi/ahoy.conf.example +++ /dev/null @@ -1,11 +0,0 @@ -[mqtt] -host = 192.168.84.2 -port = 1883 -user = bla -password = blub - -[dtu] -serial = 99978563412 - -[inverter] -serial = 444473104619 diff --git a/tools/rpi/ahoy.py b/tools/rpi/ahoy.py deleted file mode 100644 index 51194dcf..00000000 --- a/tools/rpi/ahoy.py +++ /dev/null @@ -1,345 +0,0 @@ -""" -First attempt at providing basic 'master' ('DTU') functionality -for Hoymiles micro inverters. -Based in particular on demostrated first contact by 'of22'. -""" -import sys -import argparse -import time -import struct -import crcmod -import json -from datetime import datetime -from RF24 import RF24, RF24_PA_LOW, RF24_PA_MAX, RF24_250KBPS -import paho.mqtt.client -from configparser import ConfigParser - -cfg = ConfigParser() -cfg.read('ahoy.conf') -mqtt_host = cfg.get('mqtt', 'host', fallback='192.168.1.1') -mqtt_port = cfg.getint('mqtt', 'port', fallback=1883) -mqtt_user = cfg.get('mqtt', 'user', fallback='') -mqtt_password = cfg.get('mqtt', 'password', fallback='') - -radio = RF24(22, 0, 1000000) -mqtt_client = paho.mqtt.client.Client() -mqtt_client.username_pw_set(mqtt_user, mqtt_password) -mqtt_client.connect(mqtt_host, mqtt_port) -mqtt_client.loop_start() - -# Master Address ('DTU') -dtu_ser = cfg.get('dtu', 'serial', fallback='99978563412') # identical to fc22's - -# inverter serial numbers -inv_ser = cfg.get('inverter', 'serial', fallback='444473104619') # my inverter - -# all inverters -#... - -f_crc_m = crcmod.predefined.mkPredefinedCrcFun('modbus') -f_crc8 = crcmod.mkCrcFun(0x101, initCrc=0, xorOut=0) - - -def ser_to_hm_addr(s): - """ - Calculate the 4 bytes that the HM devices use in their internal messages to - address each other. - """ - bcd = int(str(s)[-8:], base=16) - return struct.pack('>L', bcd) - - -def ser_to_esb_addr(s): - """ - Convert a Hoymiles inverter/DTU serial number into its - corresponding NRF24 'enhanced shockburst' address byte sequence (5 bytes). - - The NRF library expects these in LSB to MSB order, even though the transceiver - itself will then output them in MSB-to-LSB order over the air. - - The inverters use a BCD representation of the last 8 - digits of their serial number, in reverse byte order, - followed by \x01. - """ - air_order = ser_to_hm_addr(s)[::-1] + b'\x01' - return air_order[::-1] - - -def compose_0x80_msg(dst_ser_no=72220200, src_ser_no=72220200, ts=None): - """ - Create a valid 0x80 request with the given parameters, and containing the - current system time. - """ - - if not ts: - ts = 0x623C8ECF # identical to fc22's for testing # doc: 1644758171 - - # "framing" - p = b'' - p = p + b'\x15' - p = p + ser_to_hm_addr(dst_ser_no) - p = p + ser_to_hm_addr(src_ser_no) - p = p + b'\x80' - - # encapsulated payload - pp = b'\x0b\x00' - pp = pp + struct.pack('>L', ts) # big-endian: msb at low address - #pp = pp + b'\x00' * 8 # of22 adds a \x05 at position 19 - - pp = pp + b'\x00\x00\x00\x05\x00\x00\x00\x00' - - # CRC_M - crc_m = f_crc_m(pp) - - p = p + pp - p = p + struct.pack('>H', crc_m) - - crc8 = f_crc8(p) - p = p + struct.pack('B', crc8) - return p - - -def print_addr(a): - print(f"ser# {a} ", end='') - print(f" -> HM {' '.join([f'{x:02x}' for x in ser_to_hm_addr(a)])}", end='') - print(f" -> ESB {' '.join([f'{x:02x}' for x in ser_to_esb_addr(a)])}") - -# time of last transmission - to calculcate response time -t_last_tx = 0 - -def on_receive(p, ch_rx=None, ch_tx=None): - """ - Callback: get's invoked whenever a packet has been received. - :param p: Payload of the received packet. - """ - - d = {} - - t_now_ns = time.monotonic_ns() - ts = datetime.utcnow() - ts_unixtime = ts.timestamp() - d['ts_unixtime'] = ts_unixtime - d['isodate'] = ts.isoformat() - d['rawdata'] = " ".join([f"{b:02x}" for b in p]) - print(ts.isoformat(), end='Z ') - - # check crc8 - crc8 = f_crc8(p[:-1]) - d['crc8_valid'] = True if crc8==p[-1] else False - - # interpret content - mid = p[0] - d['mid'] = mid - d['response_time_ns'] = t_now_ns-t_last_tx - d['ch_rx'] = ch_rx - d['ch_tx'] = ch_tx - d['src'] = 'src_unkn' - d['name'] = 'name_unkn' - - if mid == 0x95: - src, dst, cmd = struct.unpack('>LLB', p[1:10]) - d['src'] = f'{src:08x}' - d['dst'] = f'{dst:08x}' - d['cmd'] = cmd - print(f'MSG src={d["src"]}, dst={d["dst"]}, cmd={d["cmd"]}:') - - if cmd==1: - d['name'] = 'dcdata' - unknown1, u1, i1, p1, u2, i2, p2, unknown2 = struct.unpack( - '>HHHHHHHH', p[10:26]) - d['u1_V'] = u1/10 - d['i1_A'] = i1/100 - d['p1_W'] = p1/10 - d['u2_V'] = u2/10 - d['i2_A'] = i2/100 - d['p2_W'] = p2/10 - d['p_W'] = d['p1_W']+d['p2_W'] - d['unknown1'] = unknown1 - d['unknown2'] = unknown2 - - elif cmd==2: - d['name'] = 'acdata' - uk1, uk2, uk3, uk4, uk5, u, f, p = struct.unpack( - '>HHHHHHHH', p[10:26]) - d['u_V'] = u/10 - d['f_Hz'] = f/100 - d['p_W'] = p/10 - d['wtot1_Wh'] = uk1 - d['wtot2_Wh'] = uk3 - d['wday1_Wh'] = uk4 - d['wday2_Wh'] = uk5 - d['uk2'] = uk2 - - elif cmd==129: - d['name'] = 'error' - - elif cmd==131: # 0x83 - d['name'] = 'statedata' - uk1, l, uk3, t, uk5, uk6 = struct.unpack('>HHHHHH', p[10:22]) - d['l_Pct'] = l - d['t_C'] = t/10 - d['uk1'] = uk1 - d['uk3'] = uk3 - d['uk5'] = uk5 - d['uk6'] = uk6 - - elif cmd==132: # 0x84 - d['name'] = 'unknown0x84' - uk1, uk2, uk3, uk4, uk5, uk6, uk7, uk8 = struct.unpack( - '>HHHHHHHH', p[10:26]) - d['uk1'] = uk1 - d['uk2'] = uk2 - d['uk3'] = uk3 - d['uk4'] = uk4 - d['uk5'] = uk5 - d['uk6'] = uk6 - d['uk7'] = uk7 - d['uk8'] = uk8 - - else: - print(f'unknown cmd {cmd}') - else: - print(f'unknown frame id {p[0]}') - - # output to stdout - if d: - print(json.dumps(d)) - - # output to MQTT - if d: - j = json.dumps(d) - mqtt_client.publish(f"ahoy/{d['src']}/{d['name']}", j) - if d['cmd']==2: - mqtt_client.publish(f'ahoy/{d["src"]}/emeter/0/voltage', d['u_V']) - mqtt_client.publish(f'ahoy/{d["src"]}/emeter/0/power', d['p_W']) - mqtt_client.publish(f'ahoy/{d["src"]}/emeter/0/total', d['wtot1_Wh']) - mqtt_client.publish(f'ahoy/{d["src"]}/frequency', d['f_Hz']) - if d['cmd']==1: - mqtt_client.publish(f'ahoy/{d["src"]}/emeter-dc/0/power', d['p1_W']) - mqtt_client.publish(f'ahoy/{d["src"]}/emeter-dc/0/voltage', d['u1_V']) - mqtt_client.publish(f'ahoy/{d["src"]}/emeter-dc/0/current', d['i1_A']) - mqtt_client.publish(f'ahoy/{d["src"]}/emeter-dc/1/power', d['p2_W']) - mqtt_client.publish(f'ahoy/{d["src"]}/emeter-dc/1/voltage', d['u2_V']) - mqtt_client.publish(f'ahoy/{d["src"]}/emeter-dc/1/current', d['i2_A']) - if d['cmd']==131: - mqtt_client.publish(f'ahoy/{d["src"]}/temperature', d['t_C']) - - - -def main_loop(): - """ - Keep receiving on channel 3. Every once in a while, transmit a request - to one of our inverters on channel 40. - """ - - global t_last_tx - - print_addr(inv_ser) - print_addr(dtu_ser) - - ctr = 1 - last_tx_message = '' - - ts = int(time.time()) # see what happens if we always send one and the same (constant) time! - - rx_channels = [3,23,61,75] - rx_channel_id = 0 - rx_channel = rx_channels[rx_channel_id] - - tx_channels = [40] - tx_channel_id = 0 - tx_channel = tx_channels[tx_channel_id] - - while True: - # Sweep receive start channel - rx_channel_id = ctr % len(rx_channels) - rx_channel = rx_channels[rx_channel_id] - - radio.setChannel(rx_channel) - radio.enableDynamicPayloads() - radio.setAutoAck(False) - radio.setPALevel(RF24_PA_MAX) - radio.setDataRate(RF24_250KBPS) - radio.openWritingPipe(ser_to_esb_addr(inv_ser)) - radio.flush_rx() - radio.flush_tx() - radio.openReadingPipe(1,ser_to_esb_addr(dtu_ser)) - radio.startListening() - - tx_channel_id = tx_channel_id + 1 - if tx_channel_id >= len(tx_channels): - tx_channel_id = 0 - tx_channel = tx_channels[tx_channel_id] - - # - # TX - # - radio.stopListening() # put radio in TX mode - radio.setChannel(tx_channel) - radio.openWritingPipe(ser_to_esb_addr(inv_ser)) - - ts = int(time.time()) - payload = compose_0x80_msg(src_ser_no=dtu_ser, dst_ser_no=inv_ser, ts=ts) - dt = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f") - last_tx_message = f"{dt} Transmit {ctr:5d}: channel={tx_channel} len={len(payload)} | " + \ - " ".join([f"{b:02x}" for b in payload]) + f" rx_ch: {rx_channel}" - print(last_tx_message) - - # for i in range(0,3): - result = radio.write(payload) # will always yield 'True' because auto-ack is disabled - # time.sleep(.05) - - t_last_tx = time.monotonic_ns() - ctr = ctr + 1 - - t_end = time.monotonic_ns()+5e9 - tslots = [1000] #, 40, 50, 60, 70] # switch channel at these ms times since transmission - - for tslot in tslots: - t_end = t_last_tx + tslot*1e6 # ms to ns - - radio.stopListening() - radio.setChannel(rx_channel) - radio.startListening() - while time.monotonic_ns() < t_end: - has_payload, pipe_number = radio.available_pipe() - if has_payload: - size = radio.getDynamicPayloadSize() - payload = radio.read(size) - # print(last_tx_message, end='') - last_tx_message = '' - dt = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f") - print(f"{dt} Received {size} bytes on channel {rx_channel} pipe {pipe_number}: " + - " ".join([f"{b:02x}" for b in payload])) - on_receive(payload, ch_rx=rx_channel, ch_tx=tx_channel) - else: - pass - # time.sleep(0.001) - - rx_channel_id = rx_channel_id + 1 - if rx_channel_id >= len(rx_channels): - rx_channel_id = 0 - rx_channel = rx_channels[rx_channel_id] - - print(flush=True, end='') - # time.sleep(2) - - - -if __name__ == "__main__": - - if not radio.begin(): - raise RuntimeError("radio hardware is not responding") - - radio.setPALevel(RF24_PA_LOW) # RF24_PA_MAX is default - - # radio.printDetails(); # (smaller) function that prints raw register values - # radio.printPrettyDetails(); # (larger) function that prints human readable data - - try: - main_loop() - - except KeyboardInterrupt: - print(" Keyboard Interrupt detected. Exiting...") - radio.powerDown() - sys.exit() diff --git a/tools/rpi/ahoy.yml.example b/tools/rpi/ahoy.yml.example new file mode 100644 index 00000000..5c27c003 --- /dev/null +++ b/tools/rpi/ahoy.yml.example @@ -0,0 +1,27 @@ +--- + +ahoy: + interval: 0 + sunset: true + + # List of available NRF24 transceivers + nrf: + - ce_pin: 22 + cs_pin: 0 + + mqtt: + disabled: false + host: example-broker.local + port: 1883 + user: 'username' + password: 'password' + + dtu: + serial: 99978563001 + + inverters: + - name: 'balkon' + serial: 114172220003 + mqtt: + send_raw_enabled: false # allow inject debug data via mqtt + topic: 'hoymiles/114172221234' # defaults to 'hoymiles/{serial}' diff --git a/tools/rpi/example-logs/example.log b/tools/rpi/example-logs/example.log index 7df44fc2..1182f14c 100644 --- a/tools/rpi/example-logs/example.log +++ b/tools/rpi/example-logs/example.log @@ -1,4202 +1,70 @@ -ser# 114174608145 -> HM 74 60 81 45 -> ESB 01 74 60 81 45 +ser# 114172220143 -> HM 72 22 01 43 -> ESB 01 72 22 01 43 ser# 99978563412 -> HM 78 56 34 12 -> ESB 01 78 56 34 12 - 1: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 c2 00 00 00 05 00 00 00 00 69 89 aa - 2: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 c3 00 00 00 05 00 00 00 00 f9 84 36 - 3: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 c4 00 00 00 05 00 00 00 00 c9 a2 27 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 20 00 22 00 62 01 23 00 29 00 78 00 00 87 -2022-03-28T16:56:36.385409Z MSG src=74608145, dst=74608145, cmd=1, u1=28.8V, i1=0.34A, p1=9.8W, u2=29.1V, i2=0.41A, p2=12.0W, unknown1=1, unknown2=0 - 4: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 c5 00 00 00 05 00 00 00 00 59 af bb - 5: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 c6 00 00 00 05 00 00 00 00 a9 bb 5c - 6: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 c7 00 00 00 05 00 00 00 00 39 b6 c0 - 7: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 c8 00 00 00 05 00 00 00 00 c9 f7 7e - 8: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 c9 00 00 00 05 00 00 00 00 59 fa e2 - 9: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 ca 00 00 00 05 00 00 00 00 a9 ee 05 - 10: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 cb 00 00 00 05 00 00 00 00 39 e3 99 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1f 00 22 00 62 01 21 00 29 00 78 00 00 ba -2022-03-28T16:56:43.415270Z MSG src=74608145, dst=74608145, cmd=1, u1=28.7V, i1=0.34A, p1=9.8W, u2=28.9V, i2=0.41A, p2=12.0W, unknown1=1, unknown2=0 - 11: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 cc 00 00 00 05 00 00 00 00 09 c5 88 - 12: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 cd 00 00 00 05 00 00 00 00 99 c8 14 - 13: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 ce 00 00 00 05 00 00 00 00 69 dc f3 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1f 00 22 00 61 01 23 00 29 00 77 00 00 b4 -2022-03-28T16:56:46.425440Z MSG src=74608145, dst=74608145, cmd=1, u1=28.7V, i1=0.34A, p1=9.7W, u2=29.1V, i2=0.41A, p2=11.9W, unknown1=1, unknown2=0 - 14: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 cf 00 00 00 05 00 00 00 00 f9 d1 6f - 15: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 d0 00 00 00 05 00 00 00 00 c9 5d cc - 16: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 d1 00 00 00 05 00 00 00 00 59 50 50 - 17: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 d2 00 00 00 05 00 00 00 00 a9 44 b7 - 18: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 d3 00 00 00 05 00 00 00 00 39 49 2b - 19: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 d4 00 00 00 05 00 00 00 00 09 6f 3a - 20: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 d5 00 00 00 05 00 00 00 00 99 62 a6 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1f 00 22 00 61 01 21 00 29 00 77 00 00 b6 -2022-03-28T16:56:53.454965Z MSG src=74608145, dst=74608145, cmd=1, u1=28.7V, i1=0.34A, p1=9.7W, u2=28.9V, i2=0.41A, p2=11.9W, unknown1=1, unknown2=0 - 21: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 d6 00 00 00 05 00 00 00 00 69 76 41 - 22: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 d7 00 00 00 05 00 00 00 00 f9 7b dd - 23: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 d8 00 00 00 05 00 00 00 00 09 3a 63 - 24: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 d9 00 00 00 05 00 00 00 00 99 37 ff - 25: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 da 00 00 00 05 00 00 00 00 69 23 18 - 26: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 db 00 00 00 05 00 00 00 00 f9 2e 84 - 27: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 dc 00 00 00 05 00 00 00 00 c9 08 95 - 28: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 dd 00 00 00 05 00 00 00 00 59 05 09 - 29: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 de 00 00 00 05 00 00 00 00 a9 11 ee - 30: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 df 00 00 00 05 00 00 00 00 39 1c 72 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 19 00 22 00 60 01 23 00 29 00 77 00 00 b3 -2022-03-28T16:57:03.494753Z MSG src=74608145, dst=74608145, cmd=1, u1=28.1V, i1=0.34A, p1=9.6W, u2=29.1V, i2=0.41A, p2=11.9W, unknown1=1, unknown2=0 - 31: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 e0 00 00 00 05 00 00 00 00 c8 09 a9 - 32: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 e1 00 00 00 05 00 00 00 00 58 04 35 - 33: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 e2 00 00 00 05 00 00 00 00 a8 10 d2 - 34: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 e3 00 00 00 05 00 00 00 00 38 1d 4e - 35: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 e4 00 00 00 05 00 00 00 00 08 3b 5f - 36: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 e5 00 00 00 05 00 00 00 00 98 36 c3 - 37: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 e6 00 00 00 05 00 00 00 00 68 22 24 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 20 00 22 00 61 01 26 00 28 00 76 00 00 8e -2022-03-28T16:57:10.525785Z MSG src=74608145, dst=74608145, cmd=1, u1=28.8V, i1=0.34A, p1=9.7W, u2=29.4V, i2=0.4A, p2=11.8W, unknown1=1, unknown2=0 - 38: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 e7 00 00 00 05 00 00 00 00 f8 2f b8 - 39: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 e8 00 00 00 05 00 00 00 00 08 6e 06 - 40: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 e9 00 00 00 05 00 00 00 00 98 63 9a - 41: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 ea 00 00 00 05 00 00 00 00 68 77 7d - 42: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 eb 00 00 00 05 00 00 00 00 f8 7a e1 - 43: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 ec 00 00 00 05 00 00 00 00 c8 5c f0 - 44: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 ed 00 00 00 05 00 00 00 00 58 51 6c - 45: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 ee 00 00 00 05 00 00 00 00 a8 45 8b - 46: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 ef 00 00 00 05 00 00 00 00 38 48 17 - 47: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 f0 00 00 00 05 00 00 00 00 08 c4 b4 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1e 00 22 00 60 01 1e 00 29 00 76 00 00 88 -2022-03-28T16:57:20.564648Z MSG src=74608145, dst=74608145, cmd=1, u1=28.6V, i1=0.34A, p1=9.6W, u2=28.6V, i2=0.41A, p2=11.8W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 2f 00 00 37 b6 06 7b 06 7e 09 36 13 87 00 cd 68 -2022-03-28T16:57:20.614246Z MSG src=74608145, dst=74608145, cmd=2, u=235.8V, f=49.99Hz, p=20.5W, uk1=12847, uk2=0, uk3=14262, uk4=1659, uk5=1662 - 48: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 f1 00 00 00 05 00 00 00 00 98 c9 28 - 49: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 f2 00 00 00 05 00 00 00 00 68 dd cf - 50: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 f3 00 00 00 05 00 00 00 00 f8 d0 53 - 51: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 f4 00 00 00 05 00 00 00 00 c8 f6 42 - 52: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 f5 00 00 00 05 00 00 00 00 58 fb de - 53: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 f6 00 00 00 05 00 00 00 00 a8 ef 39 - 54: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 f7 00 00 00 05 00 00 00 00 38 e2 a5 - 55: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 f8 00 00 00 05 00 00 00 00 c8 a3 1b - 56: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 f9 00 00 00 05 00 00 00 00 58 ae 87 - 57: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 fa 00 00 00 05 00 00 00 00 a8 ba 60 - 58: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 fb 00 00 00 05 00 00 00 00 38 b7 fc - 59: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 fc 00 00 00 05 00 00 00 00 08 91 ed - 60: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 fd 00 00 00 05 00 00 00 00 98 9c 71 - 61: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 fe 00 00 00 05 00 00 00 00 68 88 96 - 62: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e8 ff 00 00 00 05 00 00 00 00 f8 85 0a - 63: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 00 00 00 00 05 00 00 00 00 c9 91 d1 - 64: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 01 00 00 00 05 00 00 00 00 59 9c 4d -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1f 00 21 00 60 01 23 00 29 00 77 00 00 b6 -2022-03-28T16:57:37.634446Z MSG src=74608145, dst=74608145, cmd=1, u1=28.7V, i1=0.33A, p1=9.6W, u2=29.1V, i2=0.41A, p2=11.9W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 2f 00 00 37 b6 06 7b 06 7e 09 36 13 86 00 cd 69 -2022-03-28T16:57:37.683976Z MSG src=74608145, dst=74608145, cmd=2, u=235.8V, f=49.98Hz, p=20.5W, uk1=12847, uk2=0, uk3=14262, uk4=1659, uk5=1662 - 65: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 02 00 00 00 05 00 00 00 00 a9 88 aa - 66: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 03 00 00 00 05 00 00 00 00 39 85 36 - 67: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 04 00 00 00 05 00 00 00 00 09 a3 27 - 68: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 05 00 00 00 05 00 00 00 00 99 ae bb - 69: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 06 00 00 00 05 00 00 00 00 69 ba 5c - 70: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 07 00 00 00 05 00 00 00 00 f9 b7 c0 - 71: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 08 00 00 00 05 00 00 00 00 09 f6 7e - 72: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 09 00 00 00 05 00 00 00 00 99 fb e2 - 73: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 0a 00 00 00 05 00 00 00 00 69 ef 05 - 74: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 0b 00 00 00 05 00 00 00 00 f9 e2 99 - 75: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 0c 00 00 00 05 00 00 00 00 c9 c4 88 - 76: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 0d 00 00 00 05 00 00 00 00 59 c9 14 - 77: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 0e 00 00 00 05 00 00 00 00 a9 dd f3 - 78: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 0f 00 00 00 05 00 00 00 00 39 d0 6f - 79: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 10 00 00 00 05 00 00 00 00 09 5c cc - 80: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 11 00 00 00 05 00 00 00 00 99 51 50 - 81: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 12 00 00 00 05 00 00 00 00 69 45 b7 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 20 00 21 00 60 01 23 00 29 00 76 00 00 88 -2022-03-28T16:57:54.704289Z MSG src=74608145, dst=74608145, cmd=1, u1=28.8V, i1=0.33A, p1=9.6W, u2=29.1V, i2=0.41A, p2=11.8W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 2f 00 00 37 b6 06 7b 06 7e 09 33 13 86 00 cc 6d -2022-03-28T16:57:54.753884Z MSG src=74608145, dst=74608145, cmd=2, u=235.5V, f=49.98Hz, p=20.4W, uk1=12847, uk2=0, uk3=14262, uk4=1659, uk5=1662 - 82: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 13 00 00 00 05 00 00 00 00 f9 48 2b - 83: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 14 00 00 00 05 00 00 00 00 c9 6e 3a - 84: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 15 00 00 00 05 00 00 00 00 59 63 a6 - 85: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 16 00 00 00 05 00 00 00 00 a9 77 41 - 86: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 17 00 00 00 05 00 00 00 00 39 7a dd - 87: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 18 00 00 00 05 00 00 00 00 c9 3b 63 - 88: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 19 00 00 00 05 00 00 00 00 59 36 ff - 89: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 1a 00 00 00 05 00 00 00 00 a9 22 18 - 90: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 1b 00 00 00 05 00 00 00 00 39 2f 84 - 91: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 1c 00 00 00 05 00 00 00 00 09 09 95 - 92: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 1d 00 00 00 05 00 00 00 00 99 04 09 - 93: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 1e 00 00 00 05 00 00 00 00 69 10 ee - 94: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 1f 00 00 00 05 00 00 00 00 f9 1d 72 - 95: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 20 00 00 00 05 00 00 00 00 08 08 a9 - 96: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 21 00 00 00 05 00 00 00 00 98 05 35 - 97: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 22 00 00 00 05 00 00 00 00 68 11 d2 - 98: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 23 00 00 00 05 00 00 00 00 f8 1c 4e -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1c 00 21 00 5f 01 25 00 28 00 76 00 00 8c -2022-03-28T16:58:11.769373Z MSG src=74608145, dst=74608145, cmd=1, u1=28.4V, i1=0.33A, p1=9.5W, u2=29.3V, i2=0.4A, p2=11.8W, unknown1=1, unknown2=0 - 99: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 24 00 00 00 05 00 00 00 00 c8 3a 5f - 100: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 25 00 00 00 05 00 00 00 00 58 37 c3 - 101: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 26 00 00 00 05 00 00 00 00 a8 23 24 - 102: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 27 00 00 00 05 00 00 00 00 38 2e b8 - 103: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 28 00 00 00 05 00 00 00 00 c8 6f 06 - 104: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 29 00 00 00 05 00 00 00 00 58 62 9a - 105: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 2a 00 00 00 05 00 00 00 00 a8 76 7d -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 20 00 21 00 5f 01 1b 00 29 00 73 00 00 8a -2022-03-28T16:58:18.799424Z MSG src=74608145, dst=74608145, cmd=1, u1=28.8V, i1=0.33A, p1=9.5W, u2=28.3V, i2=0.41A, p2=11.5W, unknown1=1, unknown2=0 - 106: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 2b 00 00 00 05 00 00 00 00 38 7b e1 - 107: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 2c 00 00 00 05 00 00 00 00 08 5d f0 - 108: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 2d 00 00 00 05 00 00 00 00 98 50 6c - 109: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 2e 00 00 00 05 00 00 00 00 68 44 8b - 110: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 2f 00 00 00 05 00 00 00 00 f8 49 17 - 111: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 30 00 00 00 05 00 00 00 00 c8 c5 b4 - 112: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 31 00 00 00 05 00 00 00 00 58 c8 28 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1f 00 21 00 5f 01 27 00 27 00 74 00 00 80 -2022-03-28T16:58:25.829464Z MSG src=74608145, dst=74608145, cmd=1, u1=28.7V, i1=0.33A, p1=9.5W, u2=29.5V, i2=0.39A, p2=11.6W, unknown1=1, unknown2=0 - 113: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 32 00 00 00 05 00 00 00 00 a8 dc cf - 114: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 33 00 00 00 05 00 00 00 00 38 d1 53 - 115: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 34 00 00 00 05 00 00 00 00 08 f7 42 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1c 00 21 00 5e 01 24 00 28 00 75 00 00 8f -2022-03-28T16:58:28.839812Z MSG src=74608145, dst=74608145, cmd=1, u1=28.4V, i1=0.33A, p1=9.4W, u2=29.2V, i2=0.4A, p2=11.7W, unknown1=1, unknown2=0 - 116: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 35 00 00 00 05 00 00 00 00 98 fa de - 117: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 36 00 00 00 05 00 00 00 00 68 ee 39 - 118: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 37 00 00 00 05 00 00 00 00 f8 e3 a5 - 119: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 38 00 00 00 05 00 00 00 00 08 a2 1b - 120: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 39 00 00 00 05 00 00 00 00 98 af 87 - 121: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 3a 00 00 00 05 00 00 00 00 68 bb 60 - 122: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 3b 00 00 00 05 00 00 00 00 f8 b6 fc -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1d 00 21 00 5e 01 20 00 29 00 75 00 00 8b -2022-03-28T16:58:35.869489Z MSG src=74608145, dst=74608145, cmd=1, u1=28.5V, i1=0.33A, p1=9.4W, u2=28.8V, i2=0.41A, p2=11.7W, unknown1=1, unknown2=0 - 123: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 3c 00 00 00 05 00 00 00 00 c8 90 ed - 124: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 3d 00 00 00 05 00 00 00 00 58 9d 71 - 125: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 3e 00 00 00 05 00 00 00 00 a8 89 96 - 126: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 3f 00 00 00 05 00 00 00 00 38 84 0a - 127: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 40 00 00 00 05 00 00 00 00 0a a0 63 - 128: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 41 00 00 00 05 00 00 00 00 9a ad ff - 129: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 42 00 00 00 05 00 00 00 00 6a b9 18 - 130: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 43 00 00 00 05 00 00 00 00 fa b4 84 - 131: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 44 00 00 00 05 00 00 00 00 ca 92 95 - 132: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 45 00 00 00 05 00 00 00 00 5a 9f 09 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1c 00 21 00 5e 01 23 00 28 00 75 00 00 88 -2022-03-28T16:58:45.909606Z MSG src=74608145, dst=74608145, cmd=1, u1=28.4V, i1=0.33A, p1=9.4W, u2=29.1V, i2=0.4A, p2=11.7W, unknown1=1, unknown2=0 - 133: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 46 00 00 00 05 00 00 00 00 aa 8b ee - 134: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 47 00 00 00 05 00 00 00 00 3a 86 72 - 135: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 48 00 00 00 05 00 00 00 00 ca c7 cc - 136: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 49 00 00 00 05 00 00 00 00 5a ca 50 - 137: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 4a 00 00 00 05 00 00 00 00 aa de b7 - 138: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 4b 00 00 00 05 00 00 00 00 3a d3 2b - 139: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 4c 00 00 00 05 00 00 00 00 0a f5 3a - 140: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 4d 00 00 00 05 00 00 00 00 9a f8 a6 - 141: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 4e 00 00 00 05 00 00 00 00 6a ec 41 - 142: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 4f 00 00 00 05 00 00 00 00 fa e1 dd -Received 27 bytes on pipe 5: 95 74 60 81 45 74 60 81 45 01 00 01 01 1e 00 21 00 5e 01 26 00 28 00 75 00 00 8f -2022-03-28T16:58:55.950012Z MSG src=74608145, dst=74608145, cmd=1, u1=28.6V, i1=0.33A, p1=9.4W, u2=29.4V, i2=0.4A, p2=11.7W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 30 00 00 37 b7 06 7c 06 7f 09 35 13 87 00 c9 77 -2022-03-28T16:58:55.999239Z MSG src=74608145, dst=74608145, cmd=2, u=235.7V, f=49.99Hz, p=20.1W, uk1=12848, uk2=0, uk3=14263, uk4=1660, uk5=1663 - 143: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 50 00 00 00 05 00 00 00 00 ca 6d 7e - 144: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 51 00 00 00 05 00 00 00 00 5a 60 e2 - 145: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 52 00 00 00 05 00 00 00 00 aa 74 05 - 146: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 53 00 00 00 05 00 00 00 00 3a 79 99 - 147: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 54 00 00 00 05 00 00 00 00 0a 5f 88 - 148: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 55 00 00 00 05 00 00 00 00 9a 52 14 - 149: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 56 00 00 00 05 00 00 00 00 6a 46 f3 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 23 00 21 00 5e 01 22 00 28 00 75 00 00 b6 -2022-03-28T16:59:02.979756Z MSG src=74608145, dst=74608145, cmd=1, u1=29.1V, i1=0.33A, p1=9.4W, u2=29.0V, i2=0.4A, p2=11.7W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 30 00 00 37 b7 06 7c 06 7f 09 37 13 88 00 ca 79 -2022-03-28T16:59:03.029350Z MSG src=74608145, dst=74608145, cmd=2, u=235.9V, f=50.00Hz, p=20.2W, uk1=12848, uk2=0, uk3=14263, uk4=1660, uk5=1663 - 150: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 57 00 00 00 05 00 00 00 00 fa 4b 6f - 151: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 58 00 00 00 05 00 00 00 00 0a 0a d1 - 152: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 59 00 00 00 05 00 00 00 00 9a 07 4d - 153: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 5a 00 00 00 05 00 00 00 00 6a 13 aa - 154: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 5b 00 00 00 05 00 00 00 00 fa 1e 36 - 155: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 5c 00 00 00 05 00 00 00 00 ca 38 27 - 156: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 5d 00 00 00 05 00 00 00 00 5a 35 bb - 157: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 5e 00 00 00 05 00 00 00 00 aa 21 5c - 158: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 5f 00 00 00 05 00 00 00 00 3a 2c c0 - 159: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 61 00 00 00 05 00 00 00 00 5b 34 87 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1f 00 21 00 5e 01 24 00 28 00 75 00 00 8c -2022-03-28T16:59:13.019918Z MSG src=74608145, dst=74608145, cmd=1, u1=28.7V, i1=0.33A, p1=9.4W, u2=29.2V, i2=0.4A, p2=11.7W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 30 00 00 37 b7 06 7c 06 7f 09 37 13 88 00 ca 79 -2022-03-28T16:59:13.069550Z MSG src=74608145, dst=74608145, cmd=2, u=235.9V, f=50.00Hz, p=20.2W, uk1=12848, uk2=0, uk3=14263, uk4=1660, uk5=1663 - 160: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 62 00 00 00 05 00 00 00 00 ab 20 60 - 161: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 63 00 00 00 05 00 00 00 00 3b 2d fc - 162: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 64 00 00 00 05 00 00 00 00 0b 0b ed - 163: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 65 00 00 00 05 00 00 00 00 9b 06 71 - 164: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 66 00 00 00 05 00 00 00 00 6b 12 96 - 165: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 67 00 00 00 05 00 00 00 00 fb 1f 0a - 166: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 68 00 00 00 05 00 00 00 00 0b 5e b4 - 167: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 69 00 00 00 05 00 00 00 00 9b 53 28 - 168: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 6a 00 00 00 05 00 00 00 00 6b 47 cf - 169: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 6b 00 00 00 05 00 00 00 00 fb 4a 53 - 170: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 6c 00 00 00 05 00 00 00 00 cb 6c 42 - 171: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 6d 00 00 00 05 00 00 00 00 5b 61 de - 172: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 6e 00 00 00 05 00 00 00 00 ab 75 39 - 173: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 6f 00 00 00 05 00 00 00 00 3b 78 a5 - 174: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 70 00 00 00 05 00 00 00 00 0b f4 06 - 175: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 71 00 00 00 05 00 00 00 00 9b f9 9a - 176: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 72 00 00 00 05 00 00 00 00 6b ed 7d - 177: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 73 00 00 00 05 00 00 00 00 fb e0 e1 - 178: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 74 00 00 00 05 00 00 00 00 cb c6 f0 - 179: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 75 00 00 00 05 00 00 00 00 5b cb 6c - 180: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 76 00 00 00 05 00 00 00 00 ab df 8b - 181: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 77 00 00 00 05 00 00 00 00 3b d2 17 - 182: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 78 00 00 00 05 00 00 00 00 cb 93 a9 - 183: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 79 00 00 00 05 00 00 00 00 5b 9e 35 - 184: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 7a 00 00 00 05 00 00 00 00 ab 8a d2 - 185: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 7b 00 00 00 05 00 00 00 00 3b 87 4e - 186: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 7c 00 00 00 05 00 00 00 00 0b a1 5f -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 20 00 20 00 5d 01 24 00 28 00 74 00 00 b0 -2022-03-28T16:59:40.125295Z MSG src=74608145, dst=74608145, cmd=1, u1=28.8V, i1=0.32A, p1=9.3W, u2=29.2V, i2=0.4A, p2=11.6W, unknown1=1, unknown2=0 - 187: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 7d 00 00 00 05 00 00 00 00 9b ac c3 - 188: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 7e 00 00 00 05 00 00 00 00 6b b8 24 - 189: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 7f 00 00 00 05 00 00 00 00 fb b5 b8 - 190: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 80 00 00 00 05 00 00 00 00 0f f0 f6 - 191: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 81 00 00 00 05 00 00 00 00 9f fd 6a - 192: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 82 00 00 00 05 00 00 00 00 6f e9 8d - 193: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 83 00 00 00 05 00 00 00 00 ff e4 11 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1d 00 21 00 5d 01 24 00 28 00 73 00 00 8b -2022-03-28T16:59:47.155756Z MSG src=74608145, dst=74608145, cmd=1, u1=28.5V, i1=0.33A, p1=9.3W, u2=29.2V, i2=0.4A, p2=11.5W, unknown1=1, unknown2=0 - 194: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 84 00 00 00 05 00 00 00 00 cf c2 00 - 195: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 85 00 00 00 05 00 00 00 00 5f cf 9c - 196: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 86 00 00 00 05 00 00 00 00 af db 7b - 197: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 87 00 00 00 05 00 00 00 00 3f d6 e7 - 198: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 88 00 00 00 05 00 00 00 00 cf 97 59 - 199: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 89 00 00 00 05 00 00 00 00 5f 9a c5 - 200: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 8a 00 00 00 05 00 00 00 00 af 8e 22 - 201: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 8b 00 00 00 05 00 00 00 00 3f 83 be - 202: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 8c 00 00 00 05 00 00 00 00 0f a5 af - 203: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 8d 00 00 00 05 00 00 00 00 9f a8 33 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1c 00 21 00 5d 01 23 00 28 00 74 00 00 8a -2022-03-28T16:59:57.195642Z MSG src=74608145, dst=74608145, cmd=1, u1=28.4V, i1=0.33A, p1=9.3W, u2=29.1V, i2=0.4A, p2=11.6W, unknown1=1, unknown2=0 - 204: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 8e 00 00 00 05 00 00 00 00 6f bc d4 - 205: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 8f 00 00 00 05 00 00 00 00 ff b1 48 - 206: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 90 00 00 00 05 00 00 00 00 cf 3d eb - 207: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 91 00 00 00 05 00 00 00 00 5f 30 77 - 208: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 92 00 00 00 05 00 00 00 00 af 24 90 - 209: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 93 00 00 00 05 00 00 00 00 3f 29 0c - 210: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 94 00 00 00 05 00 00 00 00 0f 0f 1d -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 21 00 20 00 5d 01 26 00 27 00 74 00 00 bc -2022-03-28T17:00:04.225731Z MSG src=74608145, dst=74608145, cmd=1, u1=28.9V, i1=0.32A, p1=9.3W, u2=29.4V, i2=0.39A, p2=11.6W, unknown1=1, unknown2=0 - 211: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 95 00 00 00 05 00 00 00 00 9f 02 81 - 212: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 96 00 00 00 05 00 00 00 00 6f 16 66 - 213: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 97 00 00 00 05 00 00 00 00 ff 1b fa - 214: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 98 00 00 00 05 00 00 00 00 0f 5a 44 - 215: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 99 00 00 00 05 00 00 00 00 9f 57 d8 - 216: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 9a 00 00 00 05 00 00 00 00 6f 43 3f - 217: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 9b 00 00 00 05 00 00 00 00 ff 4e a3 - 218: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 9c 00 00 00 05 00 00 00 00 cf 68 b2 - 219: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 9d 00 00 00 05 00 00 00 00 5f 65 2e - 220: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 9e 00 00 00 05 00 00 00 00 af 71 c9 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1f 00 20 00 5d 01 24 00 28 00 74 00 00 8f -2022-03-28T17:00:14.266258Z MSG src=74608145, dst=74608145, cmd=1, u1=28.7V, i1=0.32A, p1=9.3W, u2=29.2V, i2=0.4A, p2=11.6W, unknown1=1, unknown2=0 - 221: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 9f 00 00 00 05 00 00 00 00 3f 7c 55 - 222: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 a0 00 00 00 05 00 00 00 00 ce 69 8e - 223: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 a1 00 00 00 05 00 00 00 00 5e 64 12 - 224: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 a2 00 00 00 05 00 00 00 00 ae 70 f5 - 225: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 a3 00 00 00 05 00 00 00 00 3e 7d 69 - 226: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 a4 00 00 00 05 00 00 00 00 0e 5b 78 - 227: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 a5 00 00 00 05 00 00 00 00 9e 56 e4 - 228: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 a6 00 00 00 05 00 00 00 00 6e 42 03 - 229: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 a7 00 00 00 05 00 00 00 00 fe 4f 9f - 230: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 a8 00 00 00 05 00 00 00 00 0e 0e 21 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1c 00 21 00 5d 01 22 00 28 00 74 00 00 8b -2022-03-28T17:00:24.306283Z MSG src=74608145, dst=74608145, cmd=1, u1=28.4V, i1=0.33A, p1=9.3W, u2=29.0V, i2=0.4A, p2=11.6W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 30 00 00 37 b7 06 7c 06 7f 09 2f 13 8a 00 c7 6e -2022-03-28T17:00:24.355716Z MSG src=74608145, dst=74608145, cmd=2, u=235.1V, f=50.02Hz, p=19.9W, uk1=12848, uk2=0, uk3=14263, uk4=1660, uk5=1663 - 231: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 a9 00 00 00 05 00 00 00 00 9e 03 bd - 232: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 aa 00 00 00 05 00 00 00 00 6e 17 5a - 233: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 ab 00 00 00 05 00 00 00 00 fe 1a c6 - 234: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 ac 00 00 00 05 00 00 00 00 ce 3c d7 - 235: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 ad 00 00 00 05 00 00 00 00 5e 31 4b - 236: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 ae 00 00 00 05 00 00 00 00 ae 25 ac - 237: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 af 00 00 00 05 00 00 00 00 3e 28 30 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1d 00 21 00 5d 01 25 00 27 00 73 00 00 85 -2022-03-28T17:00:31.336572Z MSG src=74608145, dst=74608145, cmd=1, u1=28.5V, i1=0.33A, p1=9.3W, u2=29.3V, i2=0.39A, p2=11.5W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 30 00 00 37 b7 06 7c 06 7f 09 2d 13 8a 00 c7 6c -2022-03-28T17:00:31.385833Z MSG src=74608145, dst=74608145, cmd=2, u=234.9V, f=50.02Hz, p=19.9W, uk1=12848, uk2=0, uk3=14263, uk4=1660, uk5=1663 - 238: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 b0 00 00 00 05 00 00 00 00 0e a4 93 - 239: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 b1 00 00 00 05 00 00 00 00 9e a9 0f - 240: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 b2 00 00 00 05 00 00 00 00 6e bd e8 - 241: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 b3 00 00 00 05 00 00 00 00 fe b0 74 - 242: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 b4 00 00 00 05 00 00 00 00 ce 96 65 - 243: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 b5 00 00 00 05 00 00 00 00 5e 9b f9 - 244: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 b6 00 00 00 05 00 00 00 00 ae 8f 1e - 245: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 b7 00 00 00 05 00 00 00 00 3e 82 82 - 246: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 b8 00 00 00 05 00 00 00 00 ce c3 3c - 247: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 b9 00 00 00 05 00 00 00 00 5e ce a0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1f 00 20 00 5c 01 1e 00 28 00 73 00 00 b3 -2022-03-28T17:00:41.376448Z MSG src=74608145, dst=74608145, cmd=1, u1=28.7V, i1=0.32A, p1=9.2W, u2=28.6V, i2=0.4A, p2=11.5W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 30 00 00 37 b7 06 7c 06 7f 09 2e 13 8b 00 c5 6c -2022-03-28T17:00:41.426047Z MSG src=74608145, dst=74608145, cmd=2, u=235.0V, f=50.03Hz, p=19.7W, uk1=12848, uk2=0, uk3=14263, uk4=1660, uk5=1663 - 248: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 ba 00 00 00 05 00 00 00 00 ae da 47 - 249: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 bb 00 00 00 05 00 00 00 00 3e d7 db - 250: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 bc 00 00 00 05 00 00 00 00 0e f1 ca - 251: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 bd 00 00 00 05 00 00 00 00 9e fc 56 - 252: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 be 00 00 00 05 00 00 00 00 6e e8 b1 - 253: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 bf 00 00 00 05 00 00 00 00 fe e5 2d - 254: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 c0 00 00 00 05 00 00 00 00 cc c1 44 - 255: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 c1 00 00 00 05 00 00 00 00 5c cc d8 - 256: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 c2 00 00 00 05 00 00 00 00 ac d8 3f - 257: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 c3 00 00 00 05 00 00 00 00 3c d5 a3 - 258: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 c4 00 00 00 05 00 00 00 00 0c f3 b2 - 259: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 c5 00 00 00 05 00 00 00 00 9c fe 2e - 260: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 c6 00 00 00 05 00 00 00 00 6c ea c9 - 261: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 c7 00 00 00 05 00 00 00 00 fc e7 55 - 262: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 c8 00 00 00 05 00 00 00 00 0c a6 eb - 263: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 c9 00 00 00 05 00 00 00 00 9c ab 77 - 264: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 ca 00 00 00 05 00 00 00 00 6c bf 90 - 265: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 cb 00 00 00 05 00 00 00 00 fc b2 0c - 266: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 cc 00 00 00 05 00 00 00 00 cc 94 1d - 267: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 cd 00 00 00 05 00 00 00 00 5c 99 81 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1e 00 20 00 5c 01 24 00 28 00 74 00 00 8f -2022-03-28T17:01:01.453017Z MSG src=74608145, dst=74608145, cmd=1, u1=28.6V, i1=0.32A, p1=9.2W, u2=29.2V, i2=0.4A, p2=11.6W, unknown1=1, unknown2=0 - 268: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 ce 00 00 00 05 00 00 00 00 ac 8d 66 - 269: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 cf 00 00 00 05 00 00 00 00 3c 80 fa - 270: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 d0 00 00 00 05 00 00 00 00 0c 0c 59 - 271: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 d1 00 00 00 05 00 00 00 00 9c 01 c5 - 272: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 d2 00 00 00 05 00 00 00 00 6c 15 22 - 273: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 d3 00 00 00 05 00 00 00 00 fc 18 be - 274: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 d4 00 00 00 05 00 00 00 00 cc 3e af -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 21 00 20 00 5c 01 25 00 27 00 73 00 00 b9 -2022-03-28T17:01:08.482025Z MSG src=74608145, dst=74608145, cmd=1, u1=28.9V, i1=0.32A, p1=9.2W, u2=29.3V, i2=0.39A, p2=11.5W, unknown1=1, unknown2=0 - 275: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 d5 00 00 00 05 00 00 00 00 5c 33 33 - 276: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 d6 00 00 00 05 00 00 00 00 ac 27 d4 - 277: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 d7 00 00 00 05 00 00 00 00 3c 2a 48 - 278: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 d8 00 00 00 05 00 00 00 00 cc 6b f6 - 279: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 d9 00 00 00 05 00 00 00 00 5c 66 6a - 280: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 da 00 00 00 05 00 00 00 00 ac 72 8d - 281: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 db 00 00 00 05 00 00 00 00 3c 7f 11 - 282: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 dc 00 00 00 05 00 00 00 00 0c 59 00 - 283: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 dd 00 00 00 05 00 00 00 00 9c 54 9c - 284: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 de 00 00 00 05 00 00 00 00 6c 40 7b -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1e 00 20 00 5c 01 21 00 28 00 73 00 00 8d -2022-03-28T17:01:18.522282Z MSG src=74608145, dst=74608145, cmd=1, u1=28.6V, i1=0.32A, p1=9.2W, u2=28.9V, i2=0.4A, p2=11.5W, unknown1=1, unknown2=0 - 285: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 df 00 00 00 05 00 00 00 00 fc 4d e7 - 286: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 e0 00 00 00 05 00 00 00 00 0d 58 3c - 287: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 e1 00 00 00 05 00 00 00 00 9d 55 a0 - 288: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 e2 00 00 00 05 00 00 00 00 6d 41 47 - 289: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 e3 00 00 00 05 00 00 00 00 fd 4c db - 290: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 e4 00 00 00 05 00 00 00 00 cd 6a ca - 291: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 e5 00 00 00 05 00 00 00 00 5d 67 56 - 292: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 e6 00 00 00 05 00 00 00 00 ad 73 b1 - 293: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 e7 00 00 00 05 00 00 00 00 3d 7e 2d - 294: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 e8 00 00 00 05 00 00 00 00 cd 3f 93 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1e 00 20 00 5d 01 25 00 27 00 73 00 00 87 -2022-03-28T17:01:28.562545Z MSG src=74608145, dst=74608145, cmd=1, u1=28.6V, i1=0.32A, p1=9.3W, u2=29.3V, i2=0.39A, p2=11.5W, unknown1=1, unknown2=0 - 295: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 e9 00 00 00 05 00 00 00 00 5d 32 0f - 296: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 ea 00 00 00 05 00 00 00 00 ad 26 e8 - 297: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 eb 00 00 00 05 00 00 00 00 3d 2b 74 - 298: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 ec 00 00 00 05 00 00 00 00 0d 0d 65 - 299: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 ed 00 00 00 05 00 00 00 00 9d 00 f9 - 300: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 ee 00 00 00 05 00 00 00 00 6d 14 1e - 301: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 ef 00 00 00 05 00 00 00 00 fd 19 82 - 302: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 f0 00 00 00 05 00 00 00 00 cd 95 21 - 303: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 f1 00 00 00 05 00 00 00 00 5d 98 bd - 304: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 f2 00 00 00 05 00 00 00 00 ad 8c 5a -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1e 00 20 00 5d 01 21 00 28 00 74 00 00 8b -2022-03-28T17:01:38.603098Z MSG src=74608145, dst=74608145, cmd=1, u1=28.6V, i1=0.32A, p1=9.3W, u2=28.9V, i2=0.4A, p2=11.6W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 30 00 00 37 b7 06 7c 06 7f 09 28 13 8b 00 c7 68 -2022-03-28T17:01:38.652353Z MSG src=74608145, dst=74608145, cmd=2, u=234.4V, f=50.03Hz, p=19.9W, uk1=12848, uk2=0, uk3=14263, uk4=1660, uk5=1663 - 305: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 f3 00 00 00 05 00 00 00 00 3d 81 c6 - 306: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 f4 00 00 00 05 00 00 00 00 0d a7 d7 - 307: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 f5 00 00 00 05 00 00 00 00 9d aa 4b - 308: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 f6 00 00 00 05 00 00 00 00 6d be ac - 309: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 f7 00 00 00 05 00 00 00 00 fd b3 30 - 310: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 f8 00 00 00 05 00 00 00 00 0d f2 8e - 311: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 f9 00 00 00 05 00 00 00 00 9d ff 12 - 312: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 fa 00 00 00 05 00 00 00 00 6d eb f5 - 313: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 fb 00 00 00 05 00 00 00 00 fd e6 69 - 314: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 fc 00 00 00 05 00 00 00 00 cd c0 78 - 315: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 fd 00 00 00 05 00 00 00 00 5d cd e4 - 316: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 fe 00 00 00 05 00 00 00 00 ad d9 03 - 317: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 e9 ff 00 00 00 05 00 00 00 00 3d d4 9f - 318: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 00 00 00 00 05 00 00 00 00 c6 61 2d - 319: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 01 00 00 00 05 00 00 00 00 56 6c b1 - 320: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 02 00 00 00 05 00 00 00 00 a6 78 56 - 321: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 03 00 00 00 05 00 00 00 00 36 75 ca - 322: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 04 00 00 00 05 00 00 00 00 06 53 db - 323: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 05 00 00 00 05 00 00 00 00 96 5e 47 - 324: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 06 00 00 00 05 00 00 00 00 66 4a a0 - 325: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 07 00 00 00 05 00 00 00 00 f6 47 3c - 326: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 08 00 00 00 05 00 00 00 00 06 06 82 - 327: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 09 00 00 00 05 00 00 00 00 96 0b 1e - 328: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 0a 00 00 00 05 00 00 00 00 66 1f f9 - 329: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 0b 00 00 00 05 00 00 00 00 f6 12 65 - 330: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 0c 00 00 00 05 00 00 00 00 c6 34 74 - 331: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 0d 00 00 00 05 00 00 00 00 56 39 e8 - 332: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 0e 00 00 00 05 00 00 00 00 a6 2d 0f - 333: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 0f 00 00 00 05 00 00 00 00 36 20 93 - 334: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 10 00 00 00 05 00 00 00 00 06 ac 30 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1f 00 20 00 5c 01 27 00 27 00 74 00 00 82 -2022-03-28T17:02:08.718511Z MSG src=74608145, dst=74608145, cmd=1, u1=28.7V, i1=0.32A, p1=9.2W, u2=29.5V, i2=0.39A, p2=11.6W, unknown1=1, unknown2=0 - 335: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 11 00 00 00 05 00 00 00 00 96 a1 ac - 336: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 12 00 00 00 05 00 00 00 00 66 b5 4b - 337: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 13 00 00 00 05 00 00 00 00 f6 b8 d7 - 338: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 14 00 00 00 05 00 00 00 00 c6 9e c6 - 339: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 15 00 00 00 05 00 00 00 00 56 93 5a - 340: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 16 00 00 00 05 00 00 00 00 a6 87 bd - 341: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 17 00 00 00 05 00 00 00 00 36 8a 21 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 22 00 20 00 5c 01 25 00 28 00 74 00 00 b2 -2022-03-28T17:02:15.748727Z MSG src=74608145, dst=74608145, cmd=1, u1=29.0V, i1=0.32A, p1=9.2W, u2=29.3V, i2=0.4A, p2=11.6W, unknown1=1, unknown2=0 - 342: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 18 00 00 00 05 00 00 00 00 c6 cb 9f - 343: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 19 00 00 00 05 00 00 00 00 56 c6 03 - 344: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 1a 00 00 00 05 00 00 00 00 a6 d2 e4 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1c 00 20 00 5c 01 23 00 28 00 73 00 00 8d -2022-03-28T17:02:18.759910Z MSG src=74608145, dst=74608145, cmd=1, u1=28.4V, i1=0.32A, p1=9.2W, u2=29.1V, i2=0.4A, p2=11.5W, unknown1=1, unknown2=0 - 345: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 1b 00 00 00 05 00 00 00 00 36 df 78 - 346: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 1c 00 00 00 05 00 00 00 00 06 f9 69 - 347: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 1d 00 00 00 05 00 00 00 00 96 f4 f5 - 348: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 1e 00 00 00 05 00 00 00 00 66 e0 12 - 349: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 1f 00 00 00 05 00 00 00 00 f6 ed 8e - 350: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 20 00 00 00 05 00 00 00 00 07 f8 55 - 351: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 21 00 00 00 05 00 00 00 00 97 f5 c9 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 20 00 20 00 5c 01 1d 00 29 00 73 00 00 8e -2022-03-28T17:02:25.788950Z MSG src=74608145, dst=74608145, cmd=1, u1=28.8V, i1=0.32A, p1=9.2W, u2=28.5V, i2=0.41A, p2=11.5W, unknown1=1, unknown2=0 - 352: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 22 00 00 00 05 00 00 00 00 67 e1 2e - 353: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 23 00 00 00 05 00 00 00 00 f7 ec b2 - 354: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 24 00 00 00 05 00 00 00 00 c7 ca a3 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 20 00 20 00 5c 01 21 00 28 00 74 00 00 b4 -2022-03-28T17:02:28.799003Z MSG src=74608145, dst=74608145, cmd=1, u1=28.8V, i1=0.32A, p1=9.2W, u2=28.9V, i2=0.4A, p2=11.6W, unknown1=1, unknown2=0 - 355: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 25 00 00 00 05 00 00 00 00 57 c7 3f - 356: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 26 00 00 00 05 00 00 00 00 a7 d3 d8 - 357: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 27 00 00 00 05 00 00 00 00 37 de 44 - 358: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 28 00 00 00 05 00 00 00 00 c7 9f fa - 359: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 29 00 00 00 05 00 00 00 00 57 92 66 - 360: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 2a 00 00 00 05 00 00 00 00 a7 86 81 - 361: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 2b 00 00 00 05 00 00 00 00 37 8b 1d -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 20 00 20 00 5c 01 26 00 27 00 73 00 00 bb -2022-03-28T17:02:35.829118Z MSG src=74608145, dst=74608145, cmd=1, u1=28.8V, i1=0.32A, p1=9.2W, u2=29.4V, i2=0.39A, p2=11.5W, unknown1=1, unknown2=0 - 362: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 2c 00 00 00 05 00 00 00 00 07 ad 0c - 363: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 2d 00 00 00 05 00 00 00 00 97 a0 90 - 364: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 2e 00 00 00 05 00 00 00 00 67 b4 77 - 365: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 2f 00 00 00 05 00 00 00 00 f7 b9 eb - 366: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 30 00 00 00 05 00 00 00 00 c7 35 48 - 367: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 31 00 00 00 05 00 00 00 00 57 38 d4 - 368: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 32 00 00 00 05 00 00 00 00 a7 2c 33 - 369: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 33 00 00 00 05 00 00 00 00 37 21 af - 370: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 34 00 00 00 05 00 00 00 00 07 07 be - 371: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 35 00 00 00 05 00 00 00 00 97 0a 22 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 20 00 20 00 5c 01 20 00 28 00 73 00 00 b2 -2022-03-28T17:02:45.867839Z MSG src=74608145, dst=74608145, cmd=1, u1=28.8V, i1=0.32A, p1=9.2W, u2=28.8V, i2=0.4A, p2=11.5W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 5: 95 74 60 81 45 74 60 81 45 02 32 30 00 00 37 b7 06 7c 06 7f 09 2d 13 8c 00 c5 68 -2022-03-28T17:02:45.917383Z MSG src=74608145, dst=74608145, cmd=2, u=234.9V, f=50.04Hz, p=19.7W, uk1=12848, uk2=0, uk3=14263, uk4=1660, uk5=1663 - 372: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 36 00 00 00 05 00 00 00 00 67 1e c5 - 373: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 37 00 00 00 05 00 00 00 00 f7 13 59 - 374: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 38 00 00 00 05 00 00 00 00 07 52 e7 - 375: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 39 00 00 00 05 00 00 00 00 97 5f 7b - 376: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 3a 00 00 00 05 00 00 00 00 67 4b 9c - 377: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 3b 00 00 00 05 00 00 00 00 f7 46 00 - 378: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 3c 00 00 00 05 00 00 00 00 c7 60 11 - 379: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 3d 00 00 00 05 00 00 00 00 57 6d 8d - 380: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 3e 00 00 00 05 00 00 00 00 a7 79 6a - 381: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 3f 00 00 00 05 00 00 00 00 37 74 f6 - 382: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 40 00 00 00 05 00 00 00 00 05 50 9f - 383: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 41 00 00 00 05 00 00 00 00 95 5d 03 - 384: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 42 00 00 00 05 00 00 00 00 65 49 e4 - 385: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 43 00 00 00 05 00 00 00 00 f5 44 78 - 386: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 44 00 00 00 05 00 00 00 00 c5 62 69 - 387: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 45 00 00 00 05 00 00 00 00 55 6f f5 - 388: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 46 00 00 00 05 00 00 00 00 a5 7b 12 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1d 00 20 00 5c 01 20 00 28 00 73 00 00 8f -2022-03-28T17:03:02.936124Z MSG src=74608145, dst=74608145, cmd=1, u1=28.5V, i1=0.32A, p1=9.2W, u2=28.8V, i2=0.4A, p2=11.5W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 30 00 00 37 b7 06 7c 06 7f 09 2d 13 8d 00 c6 6a -2022-03-28T17:03:02.985454Z MSG src=74608145, dst=74608145, cmd=2, u=234.9V, f=50.05Hz, p=19.8W, uk1=12848, uk2=0, uk3=14263, uk4=1660, uk5=1663 - 389: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 47 00 00 00 05 00 00 00 00 35 76 8e - 390: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 48 00 00 00 05 00 00 00 00 c5 37 30 - 391: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 49 00 00 00 05 00 00 00 00 55 3a ac - 392: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 4a 00 00 00 05 00 00 00 00 a5 2e 4b - 393: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 4b 00 00 00 05 00 00 00 00 35 23 d7 - 394: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 4c 00 00 00 05 00 00 00 00 05 05 c6 - 395: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 4d 00 00 00 05 00 00 00 00 95 08 5a - 396: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 4e 00 00 00 05 00 00 00 00 65 1c bd - 397: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 4f 00 00 00 05 00 00 00 00 f5 11 21 - 398: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 50 00 00 00 05 00 00 00 00 c5 9d 82 - 399: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 51 00 00 00 05 00 00 00 00 55 90 1e - 400: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 52 00 00 00 05 00 00 00 00 a5 84 f9 - 401: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 53 00 00 00 05 00 00 00 00 35 89 65 - 402: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 54 00 00 00 05 00 00 00 00 05 af 74 - 403: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 55 00 00 00 05 00 00 00 00 95 a2 e8 - 404: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 56 00 00 00 05 00 00 00 00 65 b6 0f - 405: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 57 00 00 00 05 00 00 00 00 f5 bb 93 - 406: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 58 00 00 00 05 00 00 00 00 05 fa 2d - 407: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 59 00 00 00 05 00 00 00 00 95 f7 b1 - 408: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 5a 00 00 00 05 00 00 00 00 65 e3 56 - 409: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 5b 00 00 00 05 00 00 00 00 f5 ee ca - 410: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 5d 00 00 00 05 00 00 00 00 55 c5 47 - 411: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 5e 00 00 00 05 00 00 00 00 a5 d1 a0 - 412: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 5f 00 00 00 05 00 00 00 00 35 dc 3c - 413: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 60 00 00 00 05 00 00 00 00 c4 c9 e7 - 414: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 61 00 00 00 05 00 00 00 00 54 c4 7b - 415: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 62 00 00 00 05 00 00 00 00 a4 d0 9c - 416: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 63 00 00 00 05 00 00 00 00 34 dd 00 - 417: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 64 00 00 00 05 00 00 00 00 04 fb 11 - 418: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 65 00 00 00 05 00 00 00 00 94 f6 8d - 419: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 66 00 00 00 05 00 00 00 00 64 e2 6a - 420: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 67 00 00 00 05 00 00 00 00 f4 ef f6 - 421: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 68 00 00 00 05 00 00 00 00 04 ae 48 - 422: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 69 00 00 00 05 00 00 00 00 94 a3 d4 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 19 00 20 00 5b 01 23 00 28 00 74 00 00 88 -2022-03-28T17:03:37.067514Z MSG src=74608145, dst=74608145, cmd=1, u1=28.1V, i1=0.32A, p1=9.1W, u2=29.1V, i2=0.4A, p2=11.6W, unknown1=1, unknown2=0 - 423: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 6a 00 00 00 05 00 00 00 00 64 b7 33 - 424: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 6b 00 00 00 05 00 00 00 00 f4 ba af - 425: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 6c 00 00 00 05 00 00 00 00 c4 9c be - 426: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 6d 00 00 00 05 00 00 00 00 54 91 22 - 427: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 6e 00 00 00 05 00 00 00 00 a4 85 c5 - 428: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 6f 00 00 00 05 00 00 00 00 34 88 59 - 429: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 70 00 00 00 05 00 00 00 00 04 04 fa -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1e 00 20 00 5b 01 23 00 28 00 73 00 00 88 -2022-03-28T17:03:44.096453Z MSG src=74608145, dst=74608145, cmd=1, u1=28.6V, i1=0.32A, p1=9.1W, u2=29.1V, i2=0.4A, p2=11.5W, unknown1=1, unknown2=0 - 430: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 71 00 00 00 05 00 00 00 00 94 09 66 - 431: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 72 00 00 00 05 00 00 00 00 64 1d 81 - 432: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 73 00 00 00 05 00 00 00 00 f4 10 1d - 433: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 74 00 00 00 05 00 00 00 00 c4 36 0c - 434: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 75 00 00 00 05 00 00 00 00 54 3b 90 - 435: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 76 00 00 00 05 00 00 00 00 a4 2f 77 - 436: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 77 00 00 00 05 00 00 00 00 34 22 eb - 437: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 78 00 00 00 05 00 00 00 00 c4 63 55 - 438: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 79 00 00 00 05 00 00 00 00 54 6e c9 - 439: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 7a 00 00 00 05 00 00 00 00 a4 7a 2e -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 21 00 20 00 5b 01 19 00 28 00 71 00 00 8f -2022-03-28T17:03:54.135522Z MSG src=74608145, dst=74608145, cmd=1, u1=28.9V, i1=0.32A, p1=9.1W, u2=28.1V, i2=0.4A, p2=11.3W, unknown1=1, unknown2=0 - 440: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 7b 00 00 00 05 00 00 00 00 34 77 b2 - 441: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 7c 00 00 00 05 00 00 00 00 04 51 a3 - 442: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 7d 00 00 00 05 00 00 00 00 94 5c 3f - 443: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 7e 00 00 00 05 00 00 00 00 64 48 d8 - 444: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 7f 00 00 00 05 00 00 00 00 f4 45 44 - 445: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 80 00 00 00 05 00 00 00 00 00 00 0a - 446: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 81 00 00 00 05 00 00 00 00 90 0d 96 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 21 00 20 00 5b 01 22 00 27 00 72 00 00 b8 -2022-03-28T17:04:01.165226Z MSG src=74608145, dst=74608145, cmd=1, u1=28.9V, i1=0.32A, p1=9.1W, u2=29.0V, i2=0.39A, p2=11.4W, unknown1=1, unknown2=0 - 447: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 82 00 00 00 05 00 00 00 00 60 19 71 - 448: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 83 00 00 00 05 00 00 00 00 f0 14 ed - 449: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 84 00 00 00 05 00 00 00 00 c0 32 fc - 450: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 85 00 00 00 05 00 00 00 00 50 3f 60 - 451: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 86 00 00 00 05 00 00 00 00 a0 2b 87 - 452: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 87 00 00 00 05 00 00 00 00 30 26 1b - 453: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 88 00 00 00 05 00 00 00 00 c0 67 a5 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1f 00 20 00 5b 01 21 00 28 00 72 00 00 8a -2022-03-28T17:04:08.194255Z MSG src=74608145, dst=74608145, cmd=1, u1=28.7V, i1=0.32A, p1=9.1W, u2=28.9V, i2=0.4A, p2=11.4W, unknown1=1, unknown2=0 - 454: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 89 00 00 00 05 00 00 00 00 50 6a 39 - 455: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 8a 00 00 00 05 00 00 00 00 a0 7e de - 456: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 8b 00 00 00 05 00 00 00 00 30 73 42 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1e 00 20 00 5b 01 1e 00 28 00 72 00 00 b4 -2022-03-28T17:04:11.204026Z MSG src=74608145, dst=74608145, cmd=1, u1=28.6V, i1=0.32A, p1=9.1W, u2=28.6V, i2=0.4A, p2=11.4W, unknown1=1, unknown2=0 - 457: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 8c 00 00 00 05 00 00 00 00 00 55 53 - 458: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 8d 00 00 00 05 00 00 00 00 90 58 cf - 459: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 8e 00 00 00 05 00 00 00 00 60 4c 28 - 460: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 8f 00 00 00 05 00 00 00 00 f0 41 b4 - 461: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 90 00 00 00 05 00 00 00 00 c0 cd 17 - 462: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 91 00 00 00 05 00 00 00 00 50 c0 8b - 463: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 92 00 00 00 05 00 00 00 00 a0 d4 6c -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1b 00 20 00 5b 01 24 00 27 00 70 00 00 86 -2022-03-28T17:04:18.233373Z MSG src=74608145, dst=74608145, cmd=1, u1=28.3V, i1=0.32A, p1=9.1W, u2=29.2V, i2=0.39A, p2=11.2W, unknown1=1, unknown2=0 - 464: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 93 00 00 00 05 00 00 00 00 30 d9 f0 - 465: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 94 00 00 00 05 00 00 00 00 00 ff e1 - 466: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 95 00 00 00 05 00 00 00 00 90 f2 7d - 467: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 96 00 00 00 05 00 00 00 00 60 e6 9a - 468: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 97 00 00 00 05 00 00 00 00 f0 eb 06 - 469: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 98 00 00 00 05 00 00 00 00 00 aa b8 - 470: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 99 00 00 00 05 00 00 00 00 90 a7 24 - 471: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 9a 00 00 00 05 00 00 00 00 60 b3 c3 - 472: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 9b 00 00 00 05 00 00 00 00 f0 be 5f - 473: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 9c 00 00 00 05 00 00 00 00 c0 98 4e -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 21 00 20 00 5b 01 24 00 27 00 72 00 00 be -2022-03-28T17:04:28.272571Z MSG src=74608145, dst=74608145, cmd=1, u1=28.9V, i1=0.32A, p1=9.1W, u2=29.2V, i2=0.39A, p2=11.4W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 30 00 00 37 b8 06 7c 06 80 09 32 13 8e 00 c4 84 -2022-03-28T17:04:28.322052Z MSG src=74608145, dst=74608145, cmd=2, u=235.4V, f=50.06Hz, p=19.6W, uk1=12848, uk2=0, uk3=14264, uk4=1660, uk5=1664 - 474: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 9d 00 00 00 05 00 00 00 00 50 95 d2 - 475: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 9e 00 00 00 05 00 00 00 00 a0 81 35 - 476: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea 9f 00 00 00 05 00 00 00 00 30 8c a9 - 477: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea a0 00 00 00 05 00 00 00 00 c1 99 72 - 478: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea a1 00 00 00 05 00 00 00 00 51 94 ee - 479: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea a2 00 00 00 05 00 00 00 00 a1 80 09 - 480: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea a3 00 00 00 05 00 00 00 00 31 8d 95 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 20 00 20 00 5b 01 24 00 27 00 71 00 00 bc -2022-03-28T17:04:35.302079Z MSG src=74608145, dst=74608145, cmd=1, u1=28.8V, i1=0.32A, p1=9.1W, u2=29.2V, i2=0.39A, p2=11.3W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 30 00 00 37 b8 06 7c 06 80 09 31 13 8e 00 c3 80 -2022-03-28T17:04:35.351723Z MSG src=74608145, dst=74608145, cmd=2, u=235.3V, f=50.06Hz, p=19.5W, uk1=12848, uk2=0, uk3=14264, uk4=1660, uk5=1664 - 481: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea a4 00 00 00 05 00 00 00 00 01 ab 84 - 482: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea a5 00 00 00 05 00 00 00 00 91 a6 18 - 483: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea a6 00 00 00 05 00 00 00 00 61 b2 ff - 484: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea a7 00 00 00 05 00 00 00 00 f1 bf 63 - 485: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea a8 00 00 00 05 00 00 00 00 01 fe dd - 486: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea a9 00 00 00 05 00 00 00 00 91 f3 41 - 487: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea aa 00 00 00 05 00 00 00 00 61 e7 a6 - 488: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea ab 00 00 00 05 00 00 00 00 f1 ea 3a - 489: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea ac 00 00 00 05 00 00 00 00 c1 cc 2b - 490: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea ad 00 00 00 05 00 00 00 00 51 c1 b7 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1c 00 20 00 5b 01 1a 00 28 00 71 00 00 b1 -2022-03-28T17:04:45.342304Z MSG src=74608145, dst=74608145, cmd=1, u1=28.4V, i1=0.32A, p1=9.1W, u2=28.2V, i2=0.4A, p2=11.3W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 30 00 00 37 b8 06 7c 06 80 09 30 13 8c 00 c2 82 -2022-03-28T17:04:45.390797Z MSG src=74608145, dst=74608145, cmd=2, u=235.2V, f=50.04Hz, p=19.4W, uk1=12848, uk2=0, uk3=14264, uk4=1660, uk5=1664 - 491: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea ae 00 00 00 05 00 00 00 00 a1 d5 50 - 492: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea af 00 00 00 05 00 00 00 00 31 d8 cc - 493: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea b0 00 00 00 05 00 00 00 00 01 54 6f - 494: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea b1 00 00 00 05 00 00 00 00 91 59 f3 - 495: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea b2 00 00 00 05 00 00 00 00 61 4d 14 - 496: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea b3 00 00 00 05 00 00 00 00 f1 40 88 - 497: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea b4 00 00 00 05 00 00 00 00 c1 66 99 - 498: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea b5 00 00 00 05 00 00 00 00 51 6b 05 - 499: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea b6 00 00 00 05 00 00 00 00 a1 7f e2 - 500: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea b7 00 00 00 05 00 00 00 00 31 72 7e -Received 27 bytes on pipe 5: 95 74 60 81 45 74 60 81 45 01 00 01 01 21 00 20 00 5b 01 23 00 27 00 72 00 00 b9 -2022-03-28T17:04:55.380547Z MSG src=74608145, dst=74608145, cmd=1, u1=28.9V, i1=0.32A, p1=9.1W, u2=29.1V, i2=0.39A, p2=11.4W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 30 00 00 37 b8 06 7c 06 80 09 32 13 8c 00 c4 86 -2022-03-28T17:04:55.430071Z MSG src=74608145, dst=74608145, cmd=2, u=235.4V, f=50.04Hz, p=19.6W, uk1=12848, uk2=0, uk3=14264, uk4=1660, uk5=1664 - 501: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea b8 00 00 00 05 00 00 00 00 c1 33 c0 - 502: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea b9 00 00 00 05 00 00 00 00 51 3e 5c - 503: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea ba 00 00 00 05 00 00 00 00 a1 2a bb - 504: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea bb 00 00 00 05 00 00 00 00 31 27 27 - 505: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea bc 00 00 00 05 00 00 00 00 01 01 36 - 506: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea bd 00 00 00 05 00 00 00 00 91 0c aa - 507: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea be 00 00 00 05 00 00 00 00 61 18 4d - 508: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea bf 00 00 00 05 00 00 00 00 f1 15 d1 - 509: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea c0 00 00 00 05 00 00 00 00 c3 31 b8 - 510: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea c1 00 00 00 05 00 00 00 00 53 3c 24 - 511: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea c2 00 00 00 05 00 00 00 00 a3 28 c3 - 512: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea c3 00 00 00 05 00 00 00 00 33 25 5f - 513: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea c4 00 00 00 05 00 00 00 00 03 03 4e - 514: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea c5 00 00 00 05 00 00 00 00 93 0e d2 - 515: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea c6 00 00 00 05 00 00 00 00 63 1a 35 - 516: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea c7 00 00 00 05 00 00 00 00 f3 17 a9 - 517: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea c8 00 00 00 05 00 00 00 00 03 56 17 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 20 00 1f 00 5a 01 23 00 27 00 70 00 00 84 -2022-03-28T17:05:12.444721Z MSG src=74608145, dst=74608145, cmd=1, u1=28.8V, i1=0.31A, p1=9.0W, u2=29.1V, i2=0.39A, p2=11.2W, unknown1=1, unknown2=0 - 518: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea c9 00 00 00 05 00 00 00 00 93 5b 8b - 519: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea ca 00 00 00 05 00 00 00 00 63 4f 6c - 520: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea cb 00 00 00 05 00 00 00 00 f3 42 f0 - 521: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea cc 00 00 00 05 00 00 00 00 c3 64 e1 - 522: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea cd 00 00 00 05 00 00 00 00 53 69 7d - 523: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea ce 00 00 00 05 00 00 00 00 a3 7d 9a - 524: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea cf 00 00 00 05 00 00 00 00 33 70 06 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 21 00 1f 00 5b 01 21 00 27 00 70 00 00 86 -2022-03-28T17:05:19.474255Z MSG src=74608145, dst=74608145, cmd=1, u1=28.9V, i1=0.31A, p1=9.1W, u2=28.9V, i2=0.39A, p2=11.2W, unknown1=1, unknown2=0 - 525: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea d0 00 00 00 05 00 00 00 00 03 fc a5 - 526: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea d1 00 00 00 05 00 00 00 00 93 f1 39 - 527: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea d2 00 00 00 05 00 00 00 00 63 e5 de - 528: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea d3 00 00 00 05 00 00 00 00 f3 e8 42 - 529: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea d4 00 00 00 05 00 00 00 00 c3 ce 53 - 530: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea d5 00 00 00 05 00 00 00 00 53 c3 cf - 531: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea d6 00 00 00 05 00 00 00 00 a3 d7 28 - 532: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea d7 00 00 00 05 00 00 00 00 33 da b4 - 533: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea d8 00 00 00 05 00 00 00 00 c3 9b 0a - 534: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea d9 00 00 00 05 00 00 00 00 53 96 96 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 23 00 1f 00 5a 01 22 00 27 00 70 00 00 86 -2022-03-28T17:05:29.513352Z MSG src=74608145, dst=74608145, cmd=1, u1=29.1V, i1=0.31A, p1=9.0W, u2=29.0V, i2=0.39A, p2=11.2W, unknown1=1, unknown2=0 - 535: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea da 00 00 00 05 00 00 00 00 a3 82 71 - 536: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea db 00 00 00 05 00 00 00 00 33 8f ed - 537: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea dc 00 00 00 05 00 00 00 00 03 a9 fc - 538: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea dd 00 00 00 05 00 00 00 00 93 a4 60 - 539: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea de 00 00 00 05 00 00 00 00 63 b0 87 - 540: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea df 00 00 00 05 00 00 00 00 f3 bd 1b - 541: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea e0 00 00 00 05 00 00 00 00 02 a8 c0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1d 00 20 00 5a 01 22 00 26 00 70 00 00 86 -2022-03-28T17:05:36.544028Z MSG src=74608145, dst=74608145, cmd=1, u1=28.5V, i1=0.32A, p1=9.0W, u2=29.0V, i2=0.38A, p2=11.2W, unknown1=1, unknown2=0 - 542: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea e1 00 00 00 05 00 00 00 00 92 a5 5c - 543: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea e2 00 00 00 05 00 00 00 00 62 b1 bb - 544: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea e3 00 00 00 05 00 00 00 00 f2 bc 27 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 22 00 1f 00 5a 01 23 00 26 00 6f 00 00 98 -2022-03-28T17:05:39.552788Z MSG src=74608145, dst=74608145, cmd=1, u1=29.0V, i1=0.31A, p1=9.0W, u2=29.1V, i2=0.38A, p2=11.1W, unknown1=1, unknown2=0 - 545: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea e4 00 00 00 05 00 00 00 00 c2 9a 36 - 546: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea e5 00 00 00 05 00 00 00 00 52 97 aa - 547: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea e6 00 00 00 05 00 00 00 00 a2 83 4d - 548: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea e7 00 00 00 05 00 00 00 00 32 8e d1 - 549: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea e8 00 00 00 05 00 00 00 00 c2 cf 6f - 550: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea e9 00 00 00 05 00 00 00 00 52 c2 f3 - 551: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea ea 00 00 00 05 00 00 00 00 a2 d6 14 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1d 00 20 00 5a 01 22 00 27 00 70 00 00 87 -2022-03-28T17:05:46.582433Z MSG src=74608145, dst=74608145, cmd=1, u1=28.5V, i1=0.32A, p1=9.0W, u2=29.0V, i2=0.39A, p2=11.2W, unknown1=1, unknown2=0 - 552: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea eb 00 00 00 05 00 00 00 00 32 db 88 - 553: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea ec 00 00 00 05 00 00 00 00 02 fd 99 - 554: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea ed 00 00 00 05 00 00 00 00 92 f0 05 - 555: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea ee 00 00 00 05 00 00 00 00 62 e4 e2 - 556: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea ef 00 00 00 05 00 00 00 00 f2 e9 7e - 557: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea f0 00 00 00 05 00 00 00 00 c2 65 dd - 558: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea f1 00 00 00 05 00 00 00 00 52 68 41 - 559: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea f2 00 00 00 05 00 00 00 00 a2 7c a6 - 560: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea f3 00 00 00 05 00 00 00 00 32 71 3a - 561: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea f4 00 00 00 05 00 00 00 00 02 57 2b -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1f 00 20 00 5b 01 22 00 26 00 6e 00 00 9b -2022-03-28T17:05:56.621808Z MSG src=74608145, dst=74608145, cmd=1, u1=28.7V, i1=0.32A, p1=9.1W, u2=29.0V, i2=0.38A, p2=11.0W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 31 00 00 37 b8 06 7d 06 80 09 31 13 8c 00 c0 81 -2022-03-28T17:05:56.671493Z MSG src=74608145, dst=74608145, cmd=2, u=235.3V, f=50.04Hz, p=19.2W, uk1=12849, uk2=0, uk3=14264, uk4=1661, uk5=1664 - 562: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea f5 00 00 00 05 00 00 00 00 92 5a b7 - 563: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea f6 00 00 00 05 00 00 00 00 62 4e 50 - 564: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea f7 00 00 00 05 00 00 00 00 f2 43 cc - 565: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea f8 00 00 00 05 00 00 00 00 02 02 72 - 566: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea f9 00 00 00 05 00 00 00 00 92 0f ee - 567: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea fa 00 00 00 05 00 00 00 00 62 1b 09 - 568: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea fb 00 00 00 05 00 00 00 00 f2 16 95 - 569: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea fc 00 00 00 05 00 00 00 00 c2 30 84 - 570: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea fd 00 00 00 05 00 00 00 00 52 3d 18 - 571: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea fe 00 00 00 05 00 00 00 00 a2 29 ff -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1c 00 1f 00 59 01 21 00 26 00 6e 00 00 a6 -2022-03-28T17:06:06.661736Z MSG src=74608145, dst=74608145, cmd=1, u1=28.4V, i1=0.31A, p1=8.9W, u2=28.9V, i2=0.38A, p2=11.0W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 31 00 00 37 b8 06 7d 06 80 09 2f 13 8c 00 bf e0 -2022-03-28T17:06:06.710854Z MSG src=74608145, dst=74608145, cmd=2, u=235.1V, f=50.04Hz, p=19.1W, uk1=12849, uk2=0, uk3=14264, uk4=1661, uk5=1664 - 572: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ea ff 00 00 00 05 00 00 00 00 32 24 63 - 573: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 00 00 00 00 05 00 00 00 00 03 30 b8 - 574: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 01 00 00 00 05 00 00 00 00 93 3d 24 - 575: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 02 00 00 00 05 00 00 00 00 63 29 c3 - 576: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 03 00 00 00 05 00 00 00 00 f3 24 5f - 577: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 04 00 00 00 05 00 00 00 00 c3 02 4e - 578: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 05 00 00 00 05 00 00 00 00 53 0f d2 - 579: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 06 00 00 00 05 00 00 00 00 a3 1b 35 - 580: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 07 00 00 00 05 00 00 00 00 33 16 a9 - 581: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 08 00 00 00 05 00 00 00 00 c3 57 17 - 582: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 09 00 00 00 05 00 00 00 00 53 5a 8b - 583: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 0a 00 00 00 05 00 00 00 00 a3 4e 6c - 584: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 0b 00 00 00 05 00 00 00 00 33 43 f0 - 585: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 0c 00 00 00 05 00 00 00 00 03 65 e1 - 586: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 0d 00 00 00 05 00 00 00 00 93 68 7d - 587: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 0e 00 00 00 05 00 00 00 00 63 7c 9a - 588: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 0f 00 00 00 05 00 00 00 00 f3 71 06 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1f 00 1f 00 59 01 1b 00 26 00 6d 00 00 9c -2022-03-28T17:06:23.731630Z MSG src=74608145, dst=74608145, cmd=1, u1=28.7V, i1=0.31A, p1=8.9W, u2=28.3V, i2=0.38A, p2=10.9W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 31 00 00 37 b8 06 7d 06 80 09 2f 13 8d 00 bd e3 -2022-03-28T17:06:23.780083Z MSG src=74608145, dst=74608145, cmd=2, u=235.1V, f=50.05Hz, p=18.9W, uk1=12849, uk2=0, uk3=14264, uk4=1661, uk5=1664 - 589: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 10 00 00 00 05 00 00 00 00 c3 fd a5 - 590: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 11 00 00 00 05 00 00 00 00 53 f0 39 - 591: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 12 00 00 00 05 00 00 00 00 a3 e4 de - 592: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 13 00 00 00 05 00 00 00 00 33 e9 42 - 593: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 14 00 00 00 05 00 00 00 00 03 cf 53 - 594: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 15 00 00 00 05 00 00 00 00 93 c2 cf - 595: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 16 00 00 00 05 00 00 00 00 63 d6 28 - 596: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 17 00 00 00 05 00 00 00 00 f3 db b4 - 597: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 18 00 00 00 05 00 00 00 00 03 9a 0a - 598: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 19 00 00 00 05 00 00 00 00 93 97 96 - 599: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 1a 00 00 00 05 00 00 00 00 63 83 71 - 600: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 1b 00 00 00 05 00 00 00 00 f3 8e ed - 601: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 1c 00 00 00 05 00 00 00 00 c3 a8 fc - 602: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 1d 00 00 00 05 00 00 00 00 53 a5 60 - 603: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 1e 00 00 00 05 00 00 00 00 a3 b1 87 - 604: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 1f 00 00 00 05 00 00 00 00 33 bc 1b - 605: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 20 00 00 00 05 00 00 00 00 c2 a9 c0 - 606: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 21 00 00 00 05 00 00 00 00 52 a4 5c - 607: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 22 00 00 00 05 00 00 00 00 a2 b0 bb - 608: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 23 00 00 00 05 00 00 00 00 32 bd 27 - 609: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 24 00 00 00 05 00 00 00 00 02 9b 36 - 610: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 25 00 00 00 05 00 00 00 00 92 96 aa - 611: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 26 00 00 00 05 00 00 00 00 62 82 4d - 612: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 27 00 00 00 05 00 00 00 00 f2 8f d1 - 613: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 28 00 00 00 05 00 00 00 00 02 ce 6f - 614: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 29 00 00 00 05 00 00 00 00 92 c3 f3 - 615: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 2a 00 00 00 05 00 00 00 00 62 d7 14 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 20 00 1f 00 58 01 20 00 25 00 6b 00 00 9c -2022-03-28T17:06:50.834366Z MSG src=74608145, dst=74608145, cmd=1, u1=28.8V, i1=0.31A, p1=8.8W, u2=28.8V, i2=0.37A, p2=10.7W, unknown1=1, unknown2=0 - 616: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 2b 00 00 00 05 00 00 00 00 f2 da 88 - 617: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 2c 00 00 00 05 00 00 00 00 c2 fc 99 - 618: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 2d 00 00 00 05 00 00 00 00 52 f1 05 - 619: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 2e 00 00 00 05 00 00 00 00 a2 e5 e2 - 620: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 2f 00 00 00 05 00 00 00 00 32 e8 7e - 621: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 30 00 00 00 05 00 00 00 00 02 64 dd - 622: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 31 00 00 00 05 00 00 00 00 92 69 41 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1e 00 1f 00 58 01 24 00 24 00 6a 00 00 a6 -2022-03-28T17:06:57.864130Z MSG src=74608145, dst=74608145, cmd=1, u1=28.6V, i1=0.31A, p1=8.8W, u2=29.2V, i2=0.36A, p2=10.6W, unknown1=1, unknown2=0 - 623: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 32 00 00 00 05 00 00 00 00 62 7d a6 - 624: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 33 00 00 00 05 00 00 00 00 f2 70 3a - 625: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 34 00 00 00 05 00 00 00 00 c2 56 2b -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1e 00 1f 00 58 01 1c 00 26 00 6b 00 00 9d -2022-03-28T17:07:00.873922Z MSG src=74608145, dst=74608145, cmd=1, u1=28.6V, i1=0.31A, p1=8.8W, u2=28.4V, i2=0.38A, p2=10.7W, unknown1=1, unknown2=0 - 626: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 35 00 00 00 05 00 00 00 00 52 5b b7 - 627: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 36 00 00 00 05 00 00 00 00 a2 4f 50 - 628: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 37 00 00 00 05 00 00 00 00 32 42 cc - 629: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 38 00 00 00 05 00 00 00 00 c2 03 72 - 630: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 39 00 00 00 05 00 00 00 00 52 0e ee - 631: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 3a 00 00 00 05 00 00 00 00 a2 1a 09 - 632: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 3b 00 00 00 05 00 00 00 00 32 17 95 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1c 00 1f 00 58 01 1c 00 25 00 6a 00 00 9d -2022-03-28T17:07:07.903969Z MSG src=74608145, dst=74608145, cmd=1, u1=28.4V, i1=0.31A, p1=8.8W, u2=28.4V, i2=0.37A, p2=10.6W, unknown1=1, unknown2=0 - 633: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 3c 00 00 00 05 00 00 00 00 02 31 84 - 634: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 3d 00 00 00 05 00 00 00 00 92 3c 18 - 635: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 3e 00 00 00 05 00 00 00 00 62 28 ff - 636: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 3f 00 00 00 05 00 00 00 00 f2 25 63 - 637: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 40 00 00 00 05 00 00 00 00 c0 01 0a - 638: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 41 00 00 00 05 00 00 00 00 50 0c 96 - 639: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 42 00 00 00 05 00 00 00 00 a0 18 71 - 640: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 43 00 00 00 05 00 00 00 00 30 15 ed - 641: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 44 00 00 00 05 00 00 00 00 00 33 fc - 642: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 45 00 00 00 05 00 00 00 00 90 3e 60 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1e 00 1f 00 57 01 21 00 25 00 6a 00 00 ad -2022-03-28T17:07:17.943329Z MSG src=74608145, dst=74608145, cmd=1, u1=28.6V, i1=0.31A, p1=8.7W, u2=28.9V, i2=0.37A, p2=10.6W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 31 00 00 37 b8 06 7d 06 80 09 30 13 8b 00 b9 fe -2022-03-28T17:07:17.992967Z MSG src=74608145, dst=74608145, cmd=2, u=235.2V, f=50.03Hz, p=18.5W, uk1=12849, uk2=0, uk3=14264, uk4=1661, uk5=1664 - 643: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 46 00 00 00 05 00 00 00 00 60 2a 87 - 644: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 47 00 00 00 05 00 00 00 00 f0 27 1b - 645: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 48 00 00 00 05 00 00 00 00 00 66 a5 - 646: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 49 00 00 00 05 00 00 00 00 90 6b 39 - 647: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 4a 00 00 00 05 00 00 00 00 60 7f de - 648: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 4b 00 00 00 05 00 00 00 00 f0 72 42 - 649: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 4c 00 00 00 05 00 00 00 00 c0 54 53 - 650: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 4d 00 00 00 05 00 00 00 00 50 59 cf - 651: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 4e 00 00 00 05 00 00 00 00 a0 4d 28 - 652: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 4f 00 00 00 05 00 00 00 00 30 40 b4 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1f 00 1f 00 58 01 1f 00 25 00 69 00 00 9e -2022-03-28T17:07:27.982963Z MSG src=74608145, dst=74608145, cmd=1, u1=28.7V, i1=0.31A, p1=8.8W, u2=28.7V, i2=0.37A, p2=10.5W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 31 00 00 37 b8 06 7d 06 80 09 31 13 8a 00 b8 ff -2022-03-28T17:07:28.032571Z MSG src=74608145, dst=74608145, cmd=2, u=235.3V, f=50.02Hz, p=18.4W, uk1=12849, uk2=0, uk3=14264, uk4=1661, uk5=1664 - 653: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 50 00 00 00 05 00 00 00 00 00 cc 17 - 654: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 51 00 00 00 05 00 00 00 00 90 c1 8b - 655: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 52 00 00 00 05 00 00 00 00 60 d5 6c - 656: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 53 00 00 00 05 00 00 00 00 f0 d8 f0 - 657: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 54 00 00 00 05 00 00 00 00 c0 fe e1 - 658: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 55 00 00 00 05 00 00 00 00 50 f3 7d - 659: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 56 00 00 00 05 00 00 00 00 a0 e7 9a - 660: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 57 00 00 00 05 00 00 00 00 30 ea 06 - 661: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 59 00 00 00 05 00 00 00 00 50 a6 24 - 662: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 5a 00 00 00 05 00 00 00 00 a0 b2 c3 - 663: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 5b 00 00 00 05 00 00 00 00 30 bf 5f - 664: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 5c 00 00 00 05 00 00 00 00 00 99 4e - 665: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 5d 00 00 00 05 00 00 00 00 90 94 d2 - 666: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 5e 00 00 00 05 00 00 00 00 60 80 35 - 667: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 5f 00 00 00 05 00 00 00 00 f0 8d a9 - 668: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 60 00 00 00 05 00 00 00 00 01 98 72 - 669: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 61 00 00 00 05 00 00 00 00 91 95 ee - 670: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 62 00 00 00 05 00 00 00 00 61 81 09 - 671: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 63 00 00 00 05 00 00 00 00 f1 8c 95 - 672: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 64 00 00 00 05 00 00 00 00 c1 aa 84 - 673: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 65 00 00 00 05 00 00 00 00 51 a7 18 - 674: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 66 00 00 00 05 00 00 00 00 a1 b3 ff - 675: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 67 00 00 00 05 00 00 00 00 31 be 63 - 676: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 68 00 00 00 05 00 00 00 00 c1 ff dd - 677: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 69 00 00 00 05 00 00 00 00 51 f2 41 - 678: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 6a 00 00 00 05 00 00 00 00 a1 e6 a6 - 679: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 6b 00 00 00 05 00 00 00 00 31 eb 3a - 680: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 6c 00 00 00 05 00 00 00 00 01 cd 2b - 681: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 6d 00 00 00 05 00 00 00 00 91 c0 b7 - 682: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 6e 00 00 00 05 00 00 00 00 61 d4 50 - 683: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 6f 00 00 00 05 00 00 00 00 f1 d9 cc - 684: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 70 00 00 00 05 00 00 00 00 c1 55 6f - 685: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 71 00 00 00 05 00 00 00 00 51 58 f3 - 686: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 72 00 00 00 05 00 00 00 00 a1 4c 14 - 687: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 73 00 00 00 05 00 00 00 00 31 41 88 - 688: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 74 00 00 00 05 00 00 00 00 01 67 99 - 689: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 75 00 00 00 05 00 00 00 00 91 6a 05 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1d 00 1e 00 56 01 21 00 23 00 66 00 00 a4 -2022-03-28T17:08:05.127126Z MSG src=74608145, dst=74608145, cmd=1, u1=28.5V, i1=0.3A, p1=8.6W, u2=28.9V, i2=0.35A, p2=10.2W, unknown1=1, unknown2=0 - 690: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 76 00 00 00 05 00 00 00 00 61 7e e2 - 691: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 77 00 00 00 05 00 00 00 00 f1 73 7e - 692: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 78 00 00 00 05 00 00 00 00 01 32 c0 - 693: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 79 00 00 00 05 00 00 00 00 91 3f 5c - 694: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 7a 00 00 00 05 00 00 00 00 61 2b bb - 695: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 7b 00 00 00 05 00 00 00 00 f1 26 27 - 696: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 7c 00 00 00 05 00 00 00 00 c1 00 36 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 20 00 1d 00 55 01 20 00 23 00 66 00 00 98 -2022-03-28T17:08:12.157068Z MSG src=74608145, dst=74608145, cmd=1, u1=28.8V, i1=0.29A, p1=8.5W, u2=28.8V, i2=0.35A, p2=10.2W, unknown1=1, unknown2=0 - 697: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 7d 00 00 00 05 00 00 00 00 51 0d aa - 698: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 7e 00 00 00 05 00 00 00 00 a1 19 4d - 699: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 7f 00 00 00 05 00 00 00 00 31 14 d1 - 700: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 80 00 00 00 05 00 00 00 00 c5 51 9f - 701: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 81 00 00 00 05 00 00 00 00 55 5c 03 - 702: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 82 00 00 00 05 00 00 00 00 a5 48 e4 - 703: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 83 00 00 00 05 00 00 00 00 35 45 78 - 704: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 84 00 00 00 05 00 00 00 00 05 63 69 - 705: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 85 00 00 00 05 00 00 00 00 95 6e f5 - 706: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 86 00 00 00 05 00 00 00 00 65 7a 12 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1b 00 1e 00 55 01 1e 00 23 00 65 00 00 9d -2022-03-28T17:08:22.196446Z MSG src=74608145, dst=74608145, cmd=1, u1=28.3V, i1=0.3A, p1=8.5W, u2=28.6V, i2=0.35A, p2=10.1W, unknown1=1, unknown2=0 - 707: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 87 00 00 00 05 00 00 00 00 f5 77 8e - 708: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 88 00 00 00 05 00 00 00 00 05 36 30 - 709: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 89 00 00 00 05 00 00 00 00 95 3b ac - 710: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 8a 00 00 00 05 00 00 00 00 65 2f 4b - 711: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 8b 00 00 00 05 00 00 00 00 f5 22 d7 - 712: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 8c 00 00 00 05 00 00 00 00 c5 04 c6 - 713: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 8d 00 00 00 05 00 00 00 00 55 09 5a -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1d 00 1e 00 55 01 20 00 23 00 65 00 00 a5 -2022-03-28T17:08:29.226574Z MSG src=74608145, dst=74608145, cmd=1, u1=28.5V, i1=0.3A, p1=8.5W, u2=28.8V, i2=0.35A, p2=10.1W, unknown1=1, unknown2=0 - 714: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 8e 00 00 00 05 00 00 00 00 a5 1d bd - 715: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 8f 00 00 00 05 00 00 00 00 35 10 21 - 716: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 90 00 00 00 05 00 00 00 00 05 9c 82 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1e 00 1e 00 55 01 1f 00 23 00 64 00 00 98 -2022-03-28T17:08:32.236401Z MSG src=74608145, dst=74608145, cmd=1, u1=28.6V, i1=0.3A, p1=8.5W, u2=28.7V, i2=0.35A, p2=10.0W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 31 00 00 37 b8 06 7d 06 80 09 28 13 89 00 b1 ec -2022-03-28T17:08:32.285885Z MSG src=74608145, dst=74608145, cmd=2, u=234.4V, f=50.01Hz, p=17.7W, uk1=12849, uk2=0, uk3=14264, uk4=1661, uk5=1664 - 717: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 91 00 00 00 05 00 00 00 00 95 91 1e - 718: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 92 00 00 00 05 00 00 00 00 65 85 f9 - 719: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 93 00 00 00 05 00 00 00 00 f5 88 65 - 720: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 94 00 00 00 05 00 00 00 00 c5 ae 74 - 721: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 95 00 00 00 05 00 00 00 00 55 a3 e8 - 722: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 96 00 00 00 05 00 00 00 00 a5 b7 0f - 723: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 97 00 00 00 05 00 00 00 00 35 ba 93 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1f 00 1d 00 54 01 1d 00 23 00 63 00 00 9e -2022-03-28T17:08:39.266007Z MSG src=74608145, dst=74608145, cmd=1, u1=28.7V, i1=0.29A, p1=8.4W, u2=28.5V, i2=0.35A, p2=9.9W, unknown1=1, unknown2=0 - 724: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 98 00 00 00 05 00 00 00 00 c5 fb 2d - 725: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 99 00 00 00 05 00 00 00 00 55 f6 b1 - 726: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 9a 00 00 00 05 00 00 00 00 a5 e2 56 - 727: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 9b 00 00 00 05 00 00 00 00 35 ef ca - 728: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 9c 00 00 00 05 00 00 00 00 05 c9 db - 729: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 9d 00 00 00 05 00 00 00 00 95 c4 47 - 730: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 9e 00 00 00 05 00 00 00 00 65 d0 a0 - 731: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb 9f 00 00 00 05 00 00 00 00 f5 dd 3c - 732: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb a0 00 00 00 05 00 00 00 00 04 c8 e7 - 733: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb a1 00 00 00 05 00 00 00 00 94 c5 7b -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1a 00 1e 00 53 01 1b 00 23 00 63 00 00 99 -2022-03-28T17:08:49.305817Z MSG src=74608145, dst=74608145, cmd=1, u1=28.2V, i1=0.3A, p1=8.3W, u2=28.3V, i2=0.35A, p2=9.9W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 31 00 00 37 b8 06 7d 06 80 09 2f 13 8a 00 ae f7 -2022-03-28T17:08:49.355382Z MSG src=74608145, dst=74608145, cmd=2, u=235.1V, f=50.02Hz, p=17.4W, uk1=12849, uk2=0, uk3=14264, uk4=1661, uk5=1664 - 734: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb a2 00 00 00 05 00 00 00 00 64 d1 9c - 735: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb a3 00 00 00 05 00 00 00 00 f4 dc 00 - 736: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb a4 00 00 00 05 00 00 00 00 c4 fa 11 - 737: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb a5 00 00 00 05 00 00 00 00 54 f7 8d - 738: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb a6 00 00 00 05 00 00 00 00 a4 e3 6a - 739: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb a7 00 00 00 05 00 00 00 00 34 ee f6 - 740: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb a8 00 00 00 05 00 00 00 00 c4 af 48 - 741: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb a9 00 00 00 05 00 00 00 00 54 a2 d4 - 742: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb aa 00 00 00 05 00 00 00 00 a4 b6 33 - 743: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb ab 00 00 00 05 00 00 00 00 34 bb af -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1e 00 1d 00 54 01 1c 00 23 00 62 00 00 9f -2022-03-28T17:08:59.345642Z MSG src=74608145, dst=74608145, cmd=1, u1=28.6V, i1=0.29A, p1=8.4W, u2=28.4V, i2=0.35A, p2=9.8W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 31 00 00 37 b8 06 7d 06 80 09 2b 13 89 00 ad f3 -2022-03-28T17:08:59.395193Z MSG src=74608145, dst=74608145, cmd=2, u=234.7V, f=50.01Hz, p=17.3W, uk1=12849, uk2=0, uk3=14264, uk4=1661, uk5=1664 - 744: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb ac 00 00 00 05 00 00 00 00 04 9d be - 745: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb ad 00 00 00 05 00 00 00 00 94 90 22 - 746: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb ae 00 00 00 05 00 00 00 00 64 84 c5 - 747: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb af 00 00 00 05 00 00 00 00 f4 89 59 - 748: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb b0 00 00 00 05 00 00 00 00 c4 05 fa - 749: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb b1 00 00 00 05 00 00 00 00 54 08 66 - 750: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb b2 00 00 00 05 00 00 00 00 a4 1c 81 - 751: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb b3 00 00 00 05 00 00 00 00 34 11 1d - 752: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb b4 00 00 00 05 00 00 00 00 04 37 0c - 753: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb b5 00 00 00 05 00 00 00 00 94 3a 90 - 754: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb b6 00 00 00 05 00 00 00 00 64 2e 77 - 755: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb b7 00 00 00 05 00 00 00 00 f4 23 eb - 756: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb b8 00 00 00 05 00 00 00 00 04 62 55 - 757: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb b9 00 00 00 05 00 00 00 00 94 6f c9 - 758: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb ba 00 00 00 05 00 00 00 00 64 7b 2e - 759: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb bb 00 00 00 05 00 00 00 00 f4 76 b2 - 760: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb bc 00 00 00 05 00 00 00 00 c4 50 a3 - 761: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb bd 00 00 00 05 00 00 00 00 54 5d 3f - 762: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb be 00 00 00 05 00 00 00 00 a4 49 d8 - 763: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb bf 00 00 00 05 00 00 00 00 34 44 44 - 764: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb c0 00 00 00 05 00 00 00 00 06 60 2d - 765: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb c1 00 00 00 05 00 00 00 00 96 6d b1 - 766: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb c2 00 00 00 05 00 00 00 00 66 79 56 - 767: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb c3 00 00 00 05 00 00 00 00 f6 74 ca - 768: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb c4 00 00 00 05 00 00 00 00 c6 52 db - 769: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb c5 00 00 00 05 00 00 00 00 56 5f 47 - 770: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb c6 00 00 00 05 00 00 00 00 a6 4b a0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1c 00 1d 00 52 01 1b 00 22 00 5f 00 00 a0 -2022-03-28T17:09:26.450139Z MSG src=74608145, dst=74608145, cmd=1, u1=28.4V, i1=0.29A, p1=8.2W, u2=28.3V, i2=0.34A, p2=9.5W, unknown1=1, unknown2=0 - 771: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb c7 00 00 00 05 00 00 00 00 36 46 3c - 772: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb c8 00 00 00 05 00 00 00 00 c6 07 82 - 773: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb c9 00 00 00 05 00 00 00 00 56 0a 1e - 774: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb ca 00 00 00 05 00 00 00 00 a6 1e f9 - 775: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb cb 00 00 00 05 00 00 00 00 36 13 65 - 776: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb cc 00 00 00 05 00 00 00 00 06 35 74 - 777: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb cd 00 00 00 05 00 00 00 00 96 38 e8 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1d 00 1d 00 51 01 18 00 22 00 5f 00 00 a1 -2022-03-28T17:09:33.479968Z MSG src=74608145, dst=74608145, cmd=1, u1=28.5V, i1=0.29A, p1=8.1W, u2=28.0V, i2=0.34A, p2=9.5W, unknown1=1, unknown2=0 - 778: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb ce 00 00 00 05 00 00 00 00 66 2c 0f - 779: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb cf 00 00 00 05 00 00 00 00 f6 21 93 - 780: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb d0 00 00 00 05 00 00 00 00 c6 ad 30 - 781: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb d1 00 00 00 05 00 00 00 00 56 a0 ac - 782: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb d2 00 00 00 05 00 00 00 00 a6 b4 4b - 783: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb d3 00 00 00 05 00 00 00 00 36 b9 d7 - 784: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb d4 00 00 00 05 00 00 00 00 06 9f c6 - 785: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb d5 00 00 00 05 00 00 00 00 96 92 5a - 786: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb d6 00 00 00 05 00 00 00 00 66 86 bd - 787: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb d7 00 00 00 05 00 00 00 00 f6 8b 21 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1f 00 1c 00 52 01 1d 00 21 00 5e 00 00 a6 -2022-03-28T17:09:43.520226Z MSG src=74608145, dst=74608145, cmd=1, u1=28.7V, i1=0.28A, p1=8.2W, u2=28.5V, i2=0.33A, p2=9.4W, unknown1=1, unknown2=0 - 788: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb d8 00 00 00 05 00 00 00 00 06 ca 9f - 789: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb d9 00 00 00 05 00 00 00 00 96 c7 03 - 790: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb da 00 00 00 05 00 00 00 00 66 d3 e4 - 791: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb db 00 00 00 05 00 00 00 00 f6 de 78 - 792: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb dc 00 00 00 05 00 00 00 00 c6 f8 69 - 793: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb dd 00 00 00 05 00 00 00 00 56 f5 f5 - 794: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb de 00 00 00 05 00 00 00 00 a6 e1 12 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1c 00 1c 00 51 01 1b 00 21 00 5e 00 00 a0 -2022-03-28T17:09:50.550058Z MSG src=74608145, dst=74608145, cmd=1, u1=28.4V, i1=0.28A, p1=8.1W, u2=28.3V, i2=0.33A, p2=9.4W, unknown1=1, unknown2=0 - 795: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb df 00 00 00 05 00 00 00 00 36 ec 8e - 796: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb e0 00 00 00 05 00 00 00 00 c7 f9 55 - 797: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb e1 00 00 00 05 00 00 00 00 57 f4 c9 -Received 27 bytes on pipe 5: 95 74 60 81 45 74 60 81 45 01 00 01 01 19 00 1d 00 50 01 1b 00 21 00 5d 00 00 a6 -2022-03-28T17:09:53.559813Z MSG src=74608145, dst=74608145, cmd=1, u1=28.1V, i1=0.29A, p1=8.0W, u2=28.3V, i2=0.33A, p2=9.3W, unknown1=1, unknown2=0 - 798: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb e2 00 00 00 05 00 00 00 00 a7 e0 2e - 799: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb e3 00 00 00 05 00 00 00 00 37 ed b2 - 800: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb e4 00 00 00 05 00 00 00 00 07 cb a3 - 801: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb e5 00 00 00 05 00 00 00 00 97 c6 3f - 802: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb e6 00 00 00 05 00 00 00 00 67 d2 d8 - 803: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb e7 00 00 00 05 00 00 00 00 f7 df 44 - 804: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb e8 00 00 00 05 00 00 00 00 07 9e fa -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 19 00 1c 00 50 01 1d 00 21 00 5d 00 00 a1 -2022-03-28T17:10:00.589633Z MSG src=74608145, dst=74608145, cmd=1, u1=28.1V, i1=0.28A, p1=8.0W, u2=28.5V, i2=0.33A, p2=9.3W, unknown1=1, unknown2=0 - 805: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb e9 00 00 00 05 00 00 00 00 97 93 66 - 806: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb ea 00 00 00 05 00 00 00 00 67 87 81 - 807: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb eb 00 00 00 05 00 00 00 00 f7 8a 1d - 808: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb ec 00 00 00 05 00 00 00 00 c7 ac 0c - 809: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb ed 00 00 00 05 00 00 00 00 57 a1 90 - 810: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb ee 00 00 00 05 00 00 00 00 a7 b5 77 - 811: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb ef 00 00 00 05 00 00 00 00 37 b8 eb - 812: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb f0 00 00 00 05 00 00 00 00 07 34 48 - 813: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb f1 00 00 00 05 00 00 00 00 97 39 d4 - 814: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb f2 00 00 00 05 00 00 00 00 67 2d 33 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 16 00 1c 00 4f 01 1d 00 21 00 5c 00 00 b0 -2022-03-28T17:10:10.629464Z MSG src=74608145, dst=74608145, cmd=1, u1=27.8V, i1=0.28A, p1=7.9W, u2=28.5V, i2=0.33A, p2=9.2W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 31 00 00 37 b9 06 7d 06 81 09 2a 13 89 00 a4 fb -2022-03-28T17:10:10.679075Z MSG src=74608145, dst=74608145, cmd=2, u=234.6V, f=50.01Hz, p=16.4W, uk1=12849, uk2=0, uk3=14265, uk4=1661, uk5=1665 - 815: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb f3 00 00 00 05 00 00 00 00 f7 20 af - 816: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb f4 00 00 00 05 00 00 00 00 c7 06 be - 817: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb f5 00 00 00 05 00 00 00 00 57 0b 22 - 818: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb f6 00 00 00 05 00 00 00 00 a7 1f c5 - 819: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb f7 00 00 00 05 00 00 00 00 37 12 59 - 820: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb f8 00 00 00 05 00 00 00 00 c7 53 e7 - 821: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb f9 00 00 00 05 00 00 00 00 57 5e 7b - 822: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb fa 00 00 00 05 00 00 00 00 a7 4a 9c - 823: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb fb 00 00 00 05 00 00 00 00 37 47 00 - 824: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb fc 00 00 00 05 00 00 00 00 07 61 11 - 825: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb fd 00 00 00 05 00 00 00 00 97 6c 8d - 826: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb fe 00 00 00 05 00 00 00 00 67 78 6a - 827: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 eb ff 00 00 00 05 00 00 00 00 f7 75 f6 - 828: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 00 00 00 00 05 00 00 00 00 d9 81 d4 - 829: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 01 00 00 00 05 00 00 00 00 49 8c 48 - 830: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 02 00 00 00 05 00 00 00 00 b9 98 af - 831: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 03 00 00 00 05 00 00 00 00 29 95 33 - 832: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 04 00 00 00 05 00 00 00 00 19 b3 22 - 833: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 05 00 00 00 05 00 00 00 00 89 be be - 834: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 06 00 00 00 05 00 00 00 00 79 aa 59 - 835: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 07 00 00 00 05 00 00 00 00 e9 a7 c5 - 836: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 08 00 00 00 05 00 00 00 00 19 e6 7b - 837: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 09 00 00 00 05 00 00 00 00 89 eb e7 - 838: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 0a 00 00 00 05 00 00 00 00 79 ff 00 - 839: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 0b 00 00 00 05 00 00 00 00 e9 f2 9c - 840: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 0c 00 00 00 05 00 00 00 00 d9 d4 8d - 841: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 0d 00 00 00 05 00 00 00 00 49 d9 11 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 18 00 1c 00 4e 01 1c 00 20 00 5a 00 00 b9 -2022-03-28T17:10:37.734899Z MSG src=74608145, dst=74608145, cmd=1, u1=28.0V, i1=0.28A, p1=7.8W, u2=28.4V, i2=0.32A, p2=9.0W, unknown1=1, unknown2=0 - 842: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 0e 00 00 00 05 00 00 00 00 b9 cd f6 - 843: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 0f 00 00 00 05 00 00 00 00 29 c0 6a - 844: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 10 00 00 00 05 00 00 00 00 19 4c c9 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 18 00 1c 00 4e 01 1e 00 1f 00 5a 00 00 84 -2022-03-28T17:10:40.744842Z MSG src=74608145, dst=74608145, cmd=1, u1=28.0V, i1=0.28A, p1=7.8W, u2=28.6V, i2=0.31A, p2=9.0W, unknown1=1, unknown2=0 - 845: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 11 00 00 00 05 00 00 00 00 89 41 55 - 846: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 12 00 00 00 05 00 00 00 00 79 55 b2 - 847: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 13 00 00 00 05 00 00 00 00 e9 58 2e - 848: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 14 00 00 00 05 00 00 00 00 d9 7e 3f - 849: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 15 00 00 00 05 00 00 00 00 49 73 a3 - 850: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 16 00 00 00 05 00 00 00 00 b9 67 44 - 851: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 17 00 00 00 05 00 00 00 00 29 6a d8 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1b 00 1b 00 4d 01 1d 00 1f 00 59 00 00 83 -2022-03-28T17:10:47.774446Z MSG src=74608145, dst=74608145, cmd=1, u1=28.3V, i1=0.27A, p1=7.7W, u2=28.5V, i2=0.31A, p2=8.9W, unknown1=1, unknown2=0 - 852: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 18 00 00 00 05 00 00 00 00 d9 2b 66 - 853: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 19 00 00 00 05 00 00 00 00 49 26 fa - 854: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 1a 00 00 00 05 00 00 00 00 b9 32 1d - 855: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 1b 00 00 00 05 00 00 00 00 29 3f 81 - 856: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 1c 00 00 00 05 00 00 00 00 19 19 90 - 857: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 1d 00 00 00 05 00 00 00 00 89 14 0c - 858: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 1e 00 00 00 05 00 00 00 00 79 00 eb - 859: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 1f 00 00 00 05 00 00 00 00 e9 0d 77 - 860: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 20 00 00 00 05 00 00 00 00 18 18 ac - 861: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 21 00 00 00 05 00 00 00 00 88 15 30 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 19 00 1b 00 4d 01 19 00 1f 00 58 00 00 84 -2022-03-28T17:10:57.814302Z MSG src=74608145, dst=74608145, cmd=1, u1=28.1V, i1=0.27A, p1=7.7W, u2=28.1V, i2=0.31A, p2=8.8W, unknown1=1, unknown2=0 - 862: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 22 00 00 00 05 00 00 00 00 78 01 d7 - 863: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 23 00 00 00 05 00 00 00 00 e8 0c 4b - 864: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 24 00 00 00 05 00 00 00 00 d8 2a 5a - 865: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 25 00 00 00 05 00 00 00 00 48 27 c6 - 866: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 26 00 00 00 05 00 00 00 00 b8 33 21 - 867: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 27 00 00 00 05 00 00 00 00 28 3e bd - 868: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 28 00 00 00 05 00 00 00 00 d8 7f 03 - 869: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 29 00 00 00 05 00 00 00 00 48 72 9f - 870: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 2a 00 00 00 05 00 00 00 00 b8 66 78 - 871: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 2b 00 00 00 05 00 00 00 00 28 6b e4 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1b 00 1b 00 4c 01 19 00 1f 00 57 00 00 88 -2022-03-28T17:11:07.853948Z MSG src=74608145, dst=74608145, cmd=1, u1=28.3V, i1=0.27A, p1=7.6W, u2=28.1V, i2=0.31A, p2=8.7W, unknown1=1, unknown2=0 - 872: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 2c 00 00 00 05 00 00 00 00 18 4d f5 - 873: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 2d 00 00 00 05 00 00 00 00 88 40 69 - 874: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 2e 00 00 00 05 00 00 00 00 78 54 8e - 875: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 2f 00 00 00 05 00 00 00 00 e8 59 12 - 876: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 30 00 00 00 05 00 00 00 00 d8 d5 b1 - 877: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 31 00 00 00 05 00 00 00 00 48 d8 2d - 878: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 32 00 00 00 05 00 00 00 00 b8 cc ca - 879: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 33 00 00 00 05 00 00 00 00 28 c1 56 - 880: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 34 00 00 00 05 00 00 00 00 18 e7 47 - 881: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 35 00 00 00 05 00 00 00 00 88 ea db -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 18 00 1b 00 4c 01 18 00 1f 00 56 00 00 8b -2022-03-28T17:11:17.893889Z MSG src=74608145, dst=74608145, cmd=1, u1=28.0V, i1=0.27A, p1=7.6W, u2=28.0V, i2=0.31A, p2=8.6W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 31 00 00 37 b9 06 7d 06 81 09 2b 13 88 00 9b c4 -2022-03-28T17:11:17.943475Z MSG src=74608145, dst=74608145, cmd=2, u=234.7V, f=50.00Hz, p=15.5W, uk1=12849, uk2=0, uk3=14265, uk4=1661, uk5=1665 - 882: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 36 00 00 00 05 00 00 00 00 78 fe 3c - 883: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 37 00 00 00 05 00 00 00 00 e8 f3 a0 - 884: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 38 00 00 00 05 00 00 00 00 18 b2 1e - 885: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 39 00 00 00 05 00 00 00 00 88 bf 82 - 886: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 3a 00 00 00 05 00 00 00 00 78 ab 65 - 887: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 3b 00 00 00 05 00 00 00 00 e8 a6 f9 - 888: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 3c 00 00 00 05 00 00 00 00 d8 80 e8 - 889: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 3d 00 00 00 05 00 00 00 00 48 8d 74 - 890: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 3e 00 00 00 05 00 00 00 00 b8 99 93 - 891: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 3f 00 00 00 05 00 00 00 00 28 94 0f -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1b 00 1b 00 4c 01 18 00 1f 00 56 00 00 88 -2022-03-28T17:11:27.934120Z MSG src=74608145, dst=74608145, cmd=1, u1=28.3V, i1=0.27A, p1=7.6W, u2=28.0V, i2=0.31A, p2=8.6W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 31 00 00 37 b9 06 7d 06 81 09 2b 13 89 00 9a c4 -2022-03-28T17:11:27.983408Z MSG src=74608145, dst=74608145, cmd=2, u=234.7V, f=50.01Hz, p=15.4W, uk1=12849, uk2=0, uk3=14265, uk4=1661, uk5=1665 - 892: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 40 00 00 00 05 00 00 00 00 1a b0 66 - 893: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 41 00 00 00 05 00 00 00 00 8a bd fa - 894: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 42 00 00 00 05 00 00 00 00 7a a9 1d - 895: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 43 00 00 00 05 00 00 00 00 ea a4 81 - 896: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 44 00 00 00 05 00 00 00 00 da 82 90 - 897: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 45 00 00 00 05 00 00 00 00 4a 8f 0c - 898: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 46 00 00 00 05 00 00 00 00 ba 9b eb - 899: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 47 00 00 00 05 00 00 00 00 2a 96 77 - 900: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 48 00 00 00 05 00 00 00 00 da d7 c9 - 901: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 49 00 00 00 05 00 00 00 00 4a da 55 - 902: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 4a 00 00 00 05 00 00 00 00 ba ce b2 - 903: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 4b 00 00 00 05 00 00 00 00 2a c3 2e - 904: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 4c 00 00 00 05 00 00 00 00 1a e5 3f - 905: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 4d 00 00 00 05 00 00 00 00 8a e8 a3 - 906: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 4e 00 00 00 05 00 00 00 00 7a fc 44 - 907: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 4f 00 00 00 05 00 00 00 00 ea f1 d8 - 908: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 50 00 00 00 05 00 00 00 00 da 7d 7b - 909: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 51 00 00 00 05 00 00 00 00 4a 70 e7 - 910: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 52 00 00 00 05 00 00 00 00 ba 64 00 - 911: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 53 00 00 00 05 00 00 00 00 2a 69 9c - 912: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 54 00 00 00 05 00 00 00 00 1a 4f 8d - 913: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 56 00 00 00 05 00 00 00 00 7a 56 f6 - 914: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 57 00 00 00 05 00 00 00 00 ea 5b 6a - 915: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 58 00 00 00 05 00 00 00 00 1a 1a d4 - 916: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 59 00 00 00 05 00 00 00 00 8a 17 48 - 917: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 5a 00 00 00 05 00 00 00 00 7a 03 af - 918: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 5b 00 00 00 05 00 00 00 00 ea 0e 33 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 18 00 1a 00 4a 01 1b 00 1e 00 54 00 00 8c -2022-03-28T17:11:55.038756Z MSG src=74608145, dst=74608145, cmd=1, u1=28.0V, i1=0.26A, p1=7.4W, u2=28.3V, i2=0.3A, p2=8.4W, unknown1=1, unknown2=0 - 919: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 5c 00 00 00 05 00 00 00 00 da 28 22 - 920: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 5d 00 00 00 05 00 00 00 00 4a 25 be - 921: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 5e 00 00 00 05 00 00 00 00 ba 31 59 - 922: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 5f 00 00 00 05 00 00 00 00 2a 3c c5 - 923: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 60 00 00 00 05 00 00 00 00 db 29 1e - 924: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 61 00 00 00 05 00 00 00 00 4b 24 82 - 925: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 62 00 00 00 05 00 00 00 00 bb 30 65 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 17 00 1a 00 49 01 1b 00 1e 00 54 00 00 80 -2022-03-28T17:12:02.068653Z MSG src=74608145, dst=74608145, cmd=1, u1=27.9V, i1=0.26A, p1=7.3W, u2=28.3V, i2=0.3A, p2=8.4W, unknown1=1, unknown2=0 - 926: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 63 00 00 00 05 00 00 00 00 2b 3d f9 - 927: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 64 00 00 00 05 00 00 00 00 1b 1b e8 - 928: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 65 00 00 00 05 00 00 00 00 8b 16 74 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 17 00 1a 00 49 01 1e 00 1d 00 53 00 00 81 -2022-03-28T17:12:05.078654Z MSG src=74608145, dst=74608145, cmd=1, u1=27.9V, i1=0.26A, p1=7.3W, u2=28.6V, i2=0.29A, p2=8.3W, unknown1=1, unknown2=0 - 929: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 66 00 00 00 05 00 00 00 00 7b 02 93 - 930: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 67 00 00 00 05 00 00 00 00 eb 0f 0f - 931: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 68 00 00 00 05 00 00 00 00 1b 4e b1 - 932: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 69 00 00 00 05 00 00 00 00 8b 43 2d - 933: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 6a 00 00 00 05 00 00 00 00 7b 57 ca - 934: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 6b 00 00 00 05 00 00 00 00 eb 5a 56 - 935: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 6c 00 00 00 05 00 00 00 00 db 7c 47 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1c 00 1a 00 49 01 18 00 1d 00 52 00 00 8d -2022-03-28T17:12:12.108646Z MSG src=74608145, dst=74608145, cmd=1, u1=28.4V, i1=0.26A, p1=7.3W, u2=28.0V, i2=0.29A, p2=8.2W, unknown1=1, unknown2=0 - 936: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 6d 00 00 00 05 00 00 00 00 4b 71 db - 937: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 6e 00 00 00 05 00 00 00 00 bb 65 3c - 938: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 6f 00 00 00 05 00 00 00 00 2b 68 a0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 18 00 1a 00 48 01 17 00 1d 00 52 00 00 87 -2022-03-28T17:12:15.118602Z MSG src=74608145, dst=74608145, cmd=1, u1=28.0V, i1=0.26A, p1=7.2W, u2=27.9V, i2=0.29A, p2=8.2W, unknown1=1, unknown2=0 - 939: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 70 00 00 00 05 00 00 00 00 1b e4 03 - 940: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 71 00 00 00 05 00 00 00 00 8b e9 9f - 941: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 72 00 00 00 05 00 00 00 00 7b fd 78 - 942: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 73 00 00 00 05 00 00 00 00 eb f0 e4 - 943: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 74 00 00 00 05 00 00 00 00 db d6 f5 - 944: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 75 00 00 00 05 00 00 00 00 4b db 69 - 945: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 76 00 00 00 05 00 00 00 00 bb cf 8e -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 17 00 1a 00 48 01 18 00 1d 00 52 00 00 87 -2022-03-28T17:12:22.149529Z MSG src=74608145, dst=74608145, cmd=1, u1=27.9V, i1=0.26A, p1=7.2W, u2=28.0V, i2=0.29A, p2=8.2W, unknown1=1, unknown2=0 - 946: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 77 00 00 00 05 00 00 00 00 2b c2 12 - 947: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 78 00 00 00 05 00 00 00 00 db 83 ac - 948: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 79 00 00 00 05 00 00 00 00 4b 8e 30 -Received 27 bytes on pipe 5: 95 74 60 81 45 74 60 81 45 01 00 01 01 1a 00 1a 00 48 01 1a 00 1d 00 52 00 00 88 -2022-03-28T17:12:25.158595Z MSG src=74608145, dst=74608145, cmd=1, u1=28.2V, i1=0.26A, p1=7.2W, u2=28.2V, i2=0.29A, p2=8.2W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 31 00 00 37 b9 06 7d 06 81 09 2d 13 86 00 93 c4 -2022-03-28T17:12:25.208471Z MSG src=74608145, dst=74608145, cmd=2, u=234.9V, f=49.98Hz, p=14.7W, uk1=12849, uk2=0, uk3=14265, uk4=1661, uk5=1665 - 949: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 7a 00 00 00 05 00 00 00 00 bb 9a d7 - 950: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 7b 00 00 00 05 00 00 00 00 2b 97 4b - 951: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 7c 00 00 00 05 00 00 00 00 1b b1 5a - 952: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 7d 00 00 00 05 00 00 00 00 8b bc c6 - 953: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 7e 00 00 00 05 00 00 00 00 7b a8 21 - 954: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 7f 00 00 00 05 00 00 00 00 eb a5 bd - 955: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 80 00 00 00 05 00 00 00 00 1f e0 f3 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 16 00 1a 00 47 01 18 00 1d 00 51 00 00 8a -2022-03-28T17:12:32.188911Z MSG src=74608145, dst=74608145, cmd=1, u1=27.8V, i1=0.26A, p1=7.1W, u2=28.0V, i2=0.29A, p2=8.1W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 31 00 00 37 b9 06 7d 06 81 09 2e 13 87 00 91 c4 -2022-03-28T17:12:32.238162Z MSG src=74608145, dst=74608145, cmd=2, u=235.0V, f=49.99Hz, p=14.5W, uk1=12849, uk2=0, uk3=14265, uk4=1661, uk5=1665 - 956: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 81 00 00 00 05 00 00 00 00 8f ed 6f - 957: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 82 00 00 00 05 00 00 00 00 7f f9 88 - 958: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 83 00 00 00 05 00 00 00 00 ef f4 14 - 959: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 84 00 00 00 05 00 00 00 00 df d2 05 - 960: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 85 00 00 00 05 00 00 00 00 4f df 99 - 961: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 86 00 00 00 05 00 00 00 00 bf cb 7e - 962: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 87 00 00 00 05 00 00 00 00 2f c6 e2 - 963: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 88 00 00 00 05 00 00 00 00 df 87 5c - 964: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 89 00 00 00 05 00 00 00 00 4f 8a c0 - 965: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 8a 00 00 00 05 00 00 00 00 bf 9e 27 - 966: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 8b 00 00 00 05 00 00 00 00 2f 93 bb - 967: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 8c 00 00 00 05 00 00 00 00 1f b5 aa - 968: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 8d 00 00 00 05 00 00 00 00 8f b8 36 - 969: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 8e 00 00 00 05 00 00 00 00 7f ac d1 - 970: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 8f 00 00 00 05 00 00 00 00 ef a1 4d - 971: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 90 00 00 00 05 00 00 00 00 df 2d ee - 972: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 91 00 00 00 05 00 00 00 00 4f 20 72 - 973: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 92 00 00 00 05 00 00 00 00 bf 34 95 - 974: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 93 00 00 00 05 00 00 00 00 2f 39 09 - 975: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 94 00 00 00 05 00 00 00 00 1f 1f 18 - 976: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 95 00 00 00 05 00 00 00 00 8f 12 84 - 977: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 96 00 00 00 05 00 00 00 00 7f 06 63 - 978: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 97 00 00 00 05 00 00 00 00 ef 0b ff - 979: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 98 00 00 00 05 00 00 00 00 1f 4a 41 - 980: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 99 00 00 00 05 00 00 00 00 8f 47 dd - 981: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 9a 00 00 00 05 00 00 00 00 7f 53 3a - 982: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 9b 00 00 00 05 00 00 00 00 ef 5e a6 - 983: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 9c 00 00 00 05 00 00 00 00 df 78 b7 - 984: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 9d 00 00 00 05 00 00 00 00 4f 75 2b - 985: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 9e 00 00 00 05 00 00 00 00 bf 61 cc -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 18 00 19 00 46 01 15 00 1c 00 4e 00 00 95 -2022-03-28T17:13:02.303558Z MSG src=74608145, dst=74608145, cmd=1, u1=28.0V, i1=0.25A, p1=7.0W, u2=27.7V, i2=0.28A, p2=7.8W, unknown1=1, unknown2=0 - 986: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec 9f 00 00 00 05 00 00 00 00 2f 6c 50 - 987: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec a0 00 00 00 05 00 00 00 00 de 79 8b - 988: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec a1 00 00 00 05 00 00 00 00 4e 74 17 - 989: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec a2 00 00 00 05 00 00 00 00 be 60 f0 - 990: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec a3 00 00 00 05 00 00 00 00 2e 6d 6c - 991: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec a4 00 00 00 05 00 00 00 00 1e 4b 7d - 992: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec a5 00 00 00 05 00 00 00 00 8e 46 e1 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 13 00 19 00 45 01 1a 00 1c 00 4f 00 00 93 -2022-03-28T17:13:09.333520Z MSG src=74608145, dst=74608145, cmd=1, u1=27.5V, i1=0.25A, p1=6.9W, u2=28.2V, i2=0.28A, p2=7.9W, unknown1=1, unknown2=0 - 993: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec a6 00 00 00 05 00 00 00 00 7e 52 06 - 994: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec a7 00 00 00 05 00 00 00 00 ee 5f 9a - 995: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec a8 00 00 00 05 00 00 00 00 1e 1e 24 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 14 00 19 00 45 01 18 00 1c 00 4e 00 00 97 -2022-03-28T17:13:12.343540Z MSG src=74608145, dst=74608145, cmd=1, u1=27.6V, i1=0.25A, p1=6.9W, u2=28.0V, i2=0.28A, p2=7.8W, unknown1=1, unknown2=0 - 996: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec a9 00 00 00 05 00 00 00 00 8e 13 b8 - 997: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec aa 00 00 00 05 00 00 00 00 7e 07 5f - 998: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec ab 00 00 00 05 00 00 00 00 ee 0a c3 - 999: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec ac 00 00 00 05 00 00 00 00 de 2c d2 - 1000: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec ad 00 00 00 05 00 00 00 00 4e 21 4e - 1001: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec ae 00 00 00 05 00 00 00 00 be 35 a9 - 1002: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec af 00 00 00 05 00 00 00 00 2e 38 35 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 13 00 19 00 44 01 18 00 1c 00 4e 00 00 91 -2022-03-28T17:13:19.373546Z MSG src=74608145, dst=74608145, cmd=1, u1=27.5V, i1=0.25A, p1=6.8W, u2=28.0V, i2=0.28A, p2=7.8W, unknown1=1, unknown2=0 - 1003: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec b0 00 00 00 05 00 00 00 00 1e b4 96 - 1004: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec b1 00 00 00 05 00 00 00 00 8e b9 0a - 1005: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec b2 00 00 00 05 00 00 00 00 7e ad ed - 1006: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec b3 00 00 00 05 00 00 00 00 ee a0 71 - 1007: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec b4 00 00 00 05 00 00 00 00 de 86 60 - 1008: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec b5 00 00 00 05 00 00 00 00 4e 8b fc - 1009: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec b6 00 00 00 05 00 00 00 00 be 9f 1b - 1010: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec b7 00 00 00 05 00 00 00 00 2e 92 87 - 1011: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec b8 00 00 00 05 00 00 00 00 de d3 39 - 1012: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec b9 00 00 00 05 00 00 00 00 4e de a5 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 17 00 19 00 44 01 1a 00 1c 00 4e 00 00 97 -2022-03-28T17:13:29.413865Z MSG src=74608145, dst=74608145, cmd=1, u1=27.9V, i1=0.25A, p1=6.8W, u2=28.2V, i2=0.28A, p2=7.8W, unknown1=1, unknown2=0 - 1013: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec ba 00 00 00 05 00 00 00 00 be ca 42 - 1014: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec bb 00 00 00 05 00 00 00 00 2e c7 de - 1015: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec bc 00 00 00 05 00 00 00 00 1e e1 cf - 1016: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec bd 00 00 00 05 00 00 00 00 8e ec 53 - 1017: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec be 00 00 00 05 00 00 00 00 7e f8 b4 - 1018: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec bf 00 00 00 05 00 00 00 00 ee f5 28 - 1019: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec c0 00 00 00 05 00 00 00 00 dc d1 41 - 1020: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec c1 00 00 00 05 00 00 00 00 4c dc dd - 1021: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec c2 00 00 00 05 00 00 00 00 bc c8 3a - 1022: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec c3 00 00 00 05 00 00 00 00 2c c5 a6 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 16 00 18 00 44 01 17 00 1b 00 4c 00 00 9f -2022-03-28T17:13:39.453561Z MSG src=74608145, dst=74608145, cmd=1, u1=27.8V, i1=0.24A, p1=6.8W, u2=27.9V, i2=0.27A, p2=7.6W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 b9 06 7e 06 81 09 2d 13 86 00 89 de -2022-03-28T17:13:39.503148Z MSG src=74608145, dst=74608145, cmd=2, u=234.9V, f=49.98Hz, p=13.7W, uk1=12850, uk2=0, uk3=14265, uk4=1662, uk5=1665 - 1023: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec c4 00 00 00 05 00 00 00 00 1c e3 b7 - 1024: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec c5 00 00 00 05 00 00 00 00 8c ee 2b - 1025: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec c6 00 00 00 05 00 00 00 00 7c fa cc - 1026: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec c7 00 00 00 05 00 00 00 00 ec f7 50 - 1027: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec c8 00 00 00 05 00 00 00 00 1c b6 ee - 1028: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec c9 00 00 00 05 00 00 00 00 8c bb 72 - 1029: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec ca 00 00 00 05 00 00 00 00 7c af 95 - 1030: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec cb 00 00 00 05 00 00 00 00 ec a2 09 - 1031: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec cc 00 00 00 05 00 00 00 00 dc 84 18 - 1032: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec cd 00 00 00 05 00 00 00 00 4c 89 84 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 15 00 18 00 43 01 19 00 1b 00 4c 00 00 95 -2022-03-28T17:13:49.493557Z MSG src=74608145, dst=74608145, cmd=1, u1=27.7V, i1=0.24A, p1=6.7W, u2=28.1V, i2=0.27A, p2=7.6W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 b9 06 7e 06 81 09 2d 13 87 00 88 de -2022-03-28T17:13:49.543190Z MSG src=74608145, dst=74608145, cmd=2, u=234.9V, f=49.99Hz, p=13.6W, uk1=12850, uk2=0, uk3=14265, uk4=1662, uk5=1665 - 1033: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec ce 00 00 00 05 00 00 00 00 bc 9d 63 - 1034: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec cf 00 00 00 05 00 00 00 00 2c 90 ff - 1035: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec d0 00 00 00 05 00 00 00 00 1c 1c 5c - 1036: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec d1 00 00 00 05 00 00 00 00 8c 11 c0 - 1037: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec d2 00 00 00 05 00 00 00 00 7c 05 27 - 1038: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec d3 00 00 00 05 00 00 00 00 ec 08 bb - 1039: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec d4 00 00 00 05 00 00 00 00 dc 2e aa - 1040: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec d5 00 00 00 05 00 00 00 00 4c 23 36 - 1041: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec d6 00 00 00 05 00 00 00 00 bc 37 d1 - 1042: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec d7 00 00 00 05 00 00 00 00 2c 3a 4d -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 16 00 18 00 42 01 16 00 1b 00 4b 00 00 9f -2022-03-28T17:13:59.533878Z MSG src=74608145, dst=74608145, cmd=1, u1=27.8V, i1=0.24A, p1=6.6W, u2=27.8V, i2=0.27A, p2=7.5W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 5: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 b9 06 7e 06 81 09 2e 13 87 00 87 d2 -2022-03-28T17:13:59.583119Z MSG src=74608145, dst=74608145, cmd=2, u=235.0V, f=49.99Hz, p=13.5W, uk1=12850, uk2=0, uk3=14265, uk4=1662, uk5=1665 - 1043: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec d8 00 00 00 05 00 00 00 00 dc 7b f3 - 1044: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec d9 00 00 00 05 00 00 00 00 4c 76 6f - 1045: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec da 00 00 00 05 00 00 00 00 bc 62 88 - 1046: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec db 00 00 00 05 00 00 00 00 2c 6f 14 - 1047: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec dc 00 00 00 05 00 00 00 00 1c 49 05 - 1048: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec dd 00 00 00 05 00 00 00 00 8c 44 99 - 1049: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec de 00 00 00 05 00 00 00 00 7c 50 7e - 1050: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec df 00 00 00 05 00 00 00 00 ec 5d e2 - 1051: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec e0 00 00 00 05 00 00 00 00 1d 48 39 - 1052: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec e1 00 00 00 05 00 00 00 00 8d 45 a5 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 11 00 18 00 41 01 16 00 1b 00 4a 00 00 9a -2022-03-28T17:14:09.568623Z MSG src=74608145, dst=74608145, cmd=1, u1=27.3V, i1=0.24A, p1=6.5W, u2=27.8V, i2=0.27A, p2=7.4W, unknown1=1, unknown2=0 - 1053: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec e2 00 00 00 05 00 00 00 00 7d 51 42 - 1054: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec e3 00 00 00 05 00 00 00 00 ed 5c de - 1055: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec e4 00 00 00 05 00 00 00 00 dd 7a cf - 1056: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec e5 00 00 00 05 00 00 00 00 4d 77 53 - 1057: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec e6 00 00 00 05 00 00 00 00 bd 63 b4 - 1058: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec e7 00 00 00 05 00 00 00 00 2d 6e 28 - 1059: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec e8 00 00 00 05 00 00 00 00 dd 2f 96 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 16 00 18 00 41 01 15 00 1b 00 49 00 00 9d -2022-03-28T17:14:16.598619Z MSG src=74608145, dst=74608145, cmd=1, u1=27.8V, i1=0.24A, p1=6.5W, u2=27.7V, i2=0.27A, p2=7.3W, unknown1=1, unknown2=0 - 1060: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec e9 00 00 00 05 00 00 00 00 4d 22 0a - 1061: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec ea 00 00 00 05 00 00 00 00 bd 36 ed - 1062: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec eb 00 00 00 05 00 00 00 00 2d 3b 71 - 1063: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec ec 00 00 00 05 00 00 00 00 1d 1d 60 - 1064: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec ed 00 00 00 05 00 00 00 00 8d 10 fc - 1065: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec ee 00 00 00 05 00 00 00 00 7d 04 1b - 1066: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec ef 00 00 00 05 00 00 00 00 ed 09 87 - 1067: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec f0 00 00 00 05 00 00 00 00 dd 85 24 - 1068: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec f1 00 00 00 05 00 00 00 00 4d 88 b8 - 1069: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec f2 00 00 00 05 00 00 00 00 bd 9c 5f -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 16 00 17 00 41 01 19 00 1a 00 49 00 00 9f -2022-03-28T17:14:26.638824Z MSG src=74608145, dst=74608145, cmd=1, u1=27.8V, i1=0.23A, p1=6.5W, u2=28.1V, i2=0.26A, p2=7.3W, unknown1=1, unknown2=0 - 1070: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec f3 00 00 00 05 00 00 00 00 2d 91 c3 - 1071: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec f4 00 00 00 05 00 00 00 00 1d b7 d2 - 1072: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec f5 00 00 00 05 00 00 00 00 8d ba 4e - 1073: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec f6 00 00 00 05 00 00 00 00 7d ae a9 - 1074: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec f7 00 00 00 05 00 00 00 00 ed a3 35 - 1075: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec f8 00 00 00 05 00 00 00 00 1d e2 8b - 1076: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec f9 00 00 00 05 00 00 00 00 8d ef 17 - 1077: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec fa 00 00 00 05 00 00 00 00 7d fb f0 - 1078: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec fb 00 00 00 05 00 00 00 00 ed f6 6c - 1079: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec fc 00 00 00 05 00 00 00 00 dd d0 7d -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 19 00 17 00 40 01 1c 00 1a 00 49 00 00 94 -2022-03-28T17:14:36.678691Z MSG src=74608145, dst=74608145, cmd=1, u1=28.1V, i1=0.23A, p1=6.4W, u2=28.4V, i2=0.26A, p2=7.3W, unknown1=1, unknown2=0 - 1080: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec fd 00 00 00 05 00 00 00 00 4d dd e1 - 1081: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec fe 00 00 00 05 00 00 00 00 bd c9 06 - 1082: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ec ff 00 00 00 05 00 00 00 00 2d c4 9a - 1083: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 00 00 00 00 05 00 00 00 00 1c d0 41 - 1084: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 01 00 00 00 05 00 00 00 00 8c dd dd - 1085: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 02 00 00 00 05 00 00 00 00 7c c9 3a - 1086: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 03 00 00 00 05 00 00 00 00 ec c4 a6 - 1087: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 04 00 00 00 05 00 00 00 00 dc e2 b7 - 1088: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 05 00 00 00 05 00 00 00 00 4c ef 2b - 1089: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 06 00 00 00 05 00 00 00 00 bc fb cc -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 16 00 17 00 3f 01 17 00 1a 00 48 00 00 ee -2022-03-28T17:14:46.718747Z MSG src=74608145, dst=74608145, cmd=1, u1=27.8V, i1=0.23A, p1=6.3W, u2=27.9V, i2=0.26A, p2=7.2W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 b9 06 7e 06 81 09 2e 13 87 00 81 d4 -2022-03-28T17:14:46.768301Z MSG src=74608145, dst=74608145, cmd=2, u=235.0V, f=49.99Hz, p=12.9W, uk1=12850, uk2=0, uk3=14265, uk4=1662, uk5=1665 - 1090: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 07 00 00 00 05 00 00 00 00 2c f6 50 - 1091: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 08 00 00 00 05 00 00 00 00 dc b7 ee - 1092: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 09 00 00 00 05 00 00 00 00 4c ba 72 - 1093: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 0a 00 00 00 05 00 00 00 00 bc ae 95 - 1094: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 0b 00 00 00 05 00 00 00 00 2c a3 09 - 1095: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 0c 00 00 00 05 00 00 00 00 1c 85 18 - 1096: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 0d 00 00 00 05 00 00 00 00 8c 88 84 - 1097: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 0e 00 00 00 05 00 00 00 00 7c 9c 63 - 1098: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 0f 00 00 00 05 00 00 00 00 ec 91 ff - 1099: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 10 00 00 00 05 00 00 00 00 dc 1d 5c -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 14 00 17 00 3f 01 18 00 19 00 47 00 00 ef -2022-03-28T17:14:56.758982Z MSG src=74608145, dst=74608145, cmd=1, u1=27.6V, i1=0.23A, p1=6.3W, u2=28.0V, i2=0.25A, p2=7.1W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 b9 06 7e 06 81 09 2f 13 86 00 80 d5 -2022-03-28T17:14:56.808338Z MSG src=74608145, dst=74608145, cmd=2, u=235.1V, f=49.98Hz, p=12.8W, uk1=12850, uk2=0, uk3=14265, uk4=1662, uk5=1665 - 1100: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 11 00 00 00 05 00 00 00 00 4c 10 c0 - 1101: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 12 00 00 00 05 00 00 00 00 bc 04 27 - 1102: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 13 00 00 00 05 00 00 00 00 2c 09 bb - 1103: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 14 00 00 00 05 00 00 00 00 1c 2f aa - 1104: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 15 00 00 00 05 00 00 00 00 8c 22 36 - 1105: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 16 00 00 00 05 00 00 00 00 7c 36 d1 - 1106: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 17 00 00 00 05 00 00 00 00 ec 3b 4d - 1107: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 18 00 00 00 05 00 00 00 00 1c 7a f3 - 1108: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 19 00 00 00 05 00 00 00 00 8c 77 6f - 1109: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 1a 00 00 00 05 00 00 00 00 7c 63 88 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 15 00 17 00 3e 01 19 00 19 00 46 00 00 ef -2022-03-28T17:15:06.798720Z MSG src=74608145, dst=74608145, cmd=1, u1=27.7V, i1=0.23A, p1=6.2W, u2=28.1V, i2=0.25A, p2=7.0W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 b9 06 7e 06 81 09 2e 13 86 00 7f 2b -2022-03-28T17:15:06.848482Z MSG src=74608145, dst=74608145, cmd=2, u=235.0V, f=49.98Hz, p=12.7W, uk1=12850, uk2=0, uk3=14265, uk4=1662, uk5=1665 - 1110: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 1b 00 00 00 05 00 00 00 00 ec 6e 14 - 1111: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 1c 00 00 00 05 00 00 00 00 dc 48 05 - 1112: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 1d 00 00 00 05 00 00 00 00 4c 45 99 - 1113: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 1e 00 00 00 05 00 00 00 00 bc 51 7e - 1114: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 1f 00 00 00 05 00 00 00 00 2c 5c e2 - 1115: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 20 00 00 00 05 00 00 00 00 dd 49 39 - 1116: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 21 00 00 00 05 00 00 00 00 4d 44 a5 - 1117: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 22 00 00 00 05 00 00 00 00 bd 50 42 - 1118: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 23 00 00 00 05 00 00 00 00 2d 5d de - 1119: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 24 00 00 00 05 00 00 00 00 1d 7b cf - 1120: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 25 00 00 00 05 00 00 00 00 8d 76 53 - 1121: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 26 00 00 00 05 00 00 00 00 7d 62 b4 - 1122: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 27 00 00 00 05 00 00 00 00 ed 6f 28 - 1123: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 28 00 00 00 05 00 00 00 00 1d 2e 96 - 1124: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 29 00 00 00 05 00 00 00 00 8d 23 0a - 1125: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 2a 00 00 00 05 00 00 00 00 7d 37 ed - 1126: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 2b 00 00 00 05 00 00 00 00 ed 3a 71 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 16 00 16 00 3d 01 1a 00 19 00 46 00 00 ed -2022-03-28T17:15:23.863893Z MSG src=74608145, dst=74608145, cmd=1, u1=27.8V, i1=0.22A, p1=6.1W, u2=28.2V, i2=0.25A, p2=7.0W, unknown1=1, unknown2=0 - 1127: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 2c 00 00 00 05 00 00 00 00 dd 1c 60 - 1128: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 2d 00 00 00 05 00 00 00 00 4d 11 fc - 1129: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 2e 00 00 00 05 00 00 00 00 bd 05 1b - 1130: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 2f 00 00 00 05 00 00 00 00 2d 08 87 - 1131: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 30 00 00 00 05 00 00 00 00 1d 84 24 - 1132: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 31 00 00 00 05 00 00 00 00 8d 89 b8 - 1133: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 32 00 00 00 05 00 00 00 00 7d 9d 5f - 1134: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 33 00 00 00 05 00 00 00 00 ed 90 c3 - 1135: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 34 00 00 00 05 00 00 00 00 dd b6 d2 - 1136: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 35 00 00 00 05 00 00 00 00 4d bb 4e -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 14 00 16 00 3d 01 14 00 19 00 44 00 00 e3 -2022-03-28T17:15:33.904251Z MSG src=74608145, dst=74608145, cmd=1, u1=27.6V, i1=0.22A, p1=6.1W, u2=27.6V, i2=0.25A, p2=6.8W, unknown1=1, unknown2=0 - 1137: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 36 00 00 00 05 00 00 00 00 bd af a9 - 1138: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 37 00 00 00 05 00 00 00 00 2d a2 35 - 1139: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 38 00 00 00 05 00 00 00 00 dd e3 8b - 1140: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 39 00 00 00 05 00 00 00 00 4d ee 17 - 1141: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 3a 00 00 00 05 00 00 00 00 bd fa f0 - 1142: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 3b 00 00 00 05 00 00 00 00 2d f7 6c - 1143: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 3c 00 00 00 05 00 00 00 00 1d d1 7d -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 17 00 16 00 3c 01 15 00 18 00 44 00 00 e1 -2022-03-28T17:15:40.934272Z MSG src=74608145, dst=74608145, cmd=1, u1=27.9V, i1=0.22A, p1=6.0W, u2=27.7V, i2=0.24A, p2=6.8W, unknown1=1, unknown2=0 - 1144: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 3d 00 00 00 05 00 00 00 00 8d dc e1 - 1145: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 3e 00 00 00 05 00 00 00 00 7d c8 06 - 1146: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 3f 00 00 00 05 00 00 00 00 ed c5 9a -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 16 00 16 00 3c 01 16 00 18 00 44 00 00 e3 -2022-03-28T17:15:43.944212Z MSG src=74608145, dst=74608145, cmd=1, u1=27.8V, i1=0.22A, p1=6.0W, u2=27.8V, i2=0.24A, p2=6.8W, unknown1=1, unknown2=0 - 1147: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 40 00 00 00 05 00 00 00 00 df e1 f3 - 1148: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 41 00 00 00 05 00 00 00 00 4f ec 6f - 1149: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 42 00 00 00 05 00 00 00 00 bf f8 88 - 1150: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 43 00 00 00 05 00 00 00 00 2f f5 14 - 1151: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 44 00 00 00 05 00 00 00 00 1f d3 05 - 1152: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 45 00 00 00 05 00 00 00 00 8f de 99 - 1153: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 46 00 00 00 05 00 00 00 00 7f ca 7e -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 16 00 15 00 3b 01 18 00 18 00 43 00 00 ee -2022-03-28T17:15:50.974008Z MSG src=74608145, dst=74608145, cmd=1, u1=27.8V, i1=0.21A, p1=5.9W, u2=28.0V, i2=0.24A, p2=6.7W, unknown1=1, unknown2=0 - 1154: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 47 00 00 00 05 00 00 00 00 ef c7 e2 - 1155: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 48 00 00 00 05 00 00 00 00 1f 86 5c - 1156: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 49 00 00 00 05 00 00 00 00 8f 8b c0 - 1157: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 4a 00 00 00 05 00 00 00 00 7f 9f 27 - 1158: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 4b 00 00 00 05 00 00 00 00 ef 92 bb - 1159: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 4c 00 00 00 05 00 00 00 00 df b4 aa - 1160: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 4d 00 00 00 05 00 00 00 00 4f b9 36 - 1161: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 4e 00 00 00 05 00 00 00 00 bf ad d1 - 1162: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 4f 00 00 00 05 00 00 00 00 2f a0 4d - 1163: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 50 00 00 00 05 00 00 00 00 1f 2c ee -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 13 00 15 00 3a 01 15 00 18 00 42 00 00 e6 -2022-03-28T17:16:01.014142Z MSG src=74608145, dst=74608145, cmd=1, u1=27.5V, i1=0.21A, p1=5.8W, u2=27.7V, i2=0.24A, p2=6.6W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 b9 06 7e 06 81 09 2d 13 87 00 77 21 -2022-03-28T17:16:01.063760Z MSG src=74608145, dst=74608145, cmd=2, u=234.9V, f=49.99Hz, p=11.9W, uk1=12850, uk2=0, uk3=14265, uk4=1662, uk5=1665 - 1164: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 51 00 00 00 05 00 00 00 00 8f 21 72 - 1165: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 53 00 00 00 05 00 00 00 00 ef 38 09 - 1166: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 54 00 00 00 05 00 00 00 00 df 1e 18 - 1167: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 55 00 00 00 05 00 00 00 00 4f 13 84 - 1168: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 56 00 00 00 05 00 00 00 00 bf 07 63 - 1169: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 57 00 00 00 05 00 00 00 00 2f 0a ff - 1170: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 58 00 00 00 05 00 00 00 00 df 4b 41 - 1171: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 59 00 00 00 05 00 00 00 00 4f 46 dd - 1172: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 5a 00 00 00 05 00 00 00 00 bf 52 3a - 1173: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 5b 00 00 00 05 00 00 00 00 2f 5f a6 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 12 00 15 00 3a 01 18 00 18 00 42 00 00 ea -2022-03-28T17:16:11.054452Z MSG src=74608145, dst=74608145, cmd=1, u1=27.4V, i1=0.21A, p1=5.8W, u2=28.0V, i2=0.24A, p2=6.6W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 b9 06 7e 06 81 09 2c 13 87 00 77 20 -2022-03-28T17:16:11.103733Z MSG src=74608145, dst=74608145, cmd=2, u=234.8V, f=49.99Hz, p=11.9W, uk1=12850, uk2=0, uk3=14265, uk4=1662, uk5=1665 - 1174: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 5c 00 00 00 05 00 00 00 00 1f 79 b7 - 1175: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 5d 00 00 00 05 00 00 00 00 8f 74 2b - 1176: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 5e 00 00 00 05 00 00 00 00 7f 60 cc - 1177: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 5f 00 00 00 05 00 00 00 00 ef 6d 50 - 1178: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 60 00 00 00 05 00 00 00 00 1e 78 8b - 1179: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 61 00 00 00 05 00 00 00 00 8e 75 17 - 1180: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 62 00 00 00 05 00 00 00 00 7e 61 f0 - 1181: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 63 00 00 00 05 00 00 00 00 ee 6c 6c - 1182: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 64 00 00 00 05 00 00 00 00 de 4a 7d - 1183: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 65 00 00 00 05 00 00 00 00 4e 47 e1 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 15 00 15 00 3a 01 16 00 17 00 41 00 00 ef -2022-03-28T17:16:21.094114Z MSG src=74608145, dst=74608145, cmd=1, u1=27.7V, i1=0.21A, p1=5.8W, u2=27.8V, i2=0.23A, p2=6.5W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 b9 06 7e 06 81 09 2f 13 87 00 75 21 -2022-03-28T17:16:21.143855Z MSG src=74608145, dst=74608145, cmd=2, u=235.1V, f=49.99Hz, p=11.7W, uk1=12850, uk2=0, uk3=14265, uk4=1662, uk5=1665 - 1184: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 66 00 00 00 05 00 00 00 00 be 53 06 - 1185: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 67 00 00 00 05 00 00 00 00 2e 5e 9a - 1186: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 68 00 00 00 05 00 00 00 00 de 1f 24 - 1187: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 69 00 00 00 05 00 00 00 00 4e 12 b8 - 1188: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 6a 00 00 00 05 00 00 00 00 be 06 5f - 1189: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 6b 00 00 00 05 00 00 00 00 2e 0b c3 - 1190: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 6c 00 00 00 05 00 00 00 00 1e 2d d2 - 1191: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 6d 00 00 00 05 00 00 00 00 8e 20 4e - 1192: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 6e 00 00 00 05 00 00 00 00 7e 34 a9 - 1193: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 6f 00 00 00 05 00 00 00 00 ee 39 35 - 1194: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 70 00 00 00 05 00 00 00 00 de b5 96 - 1195: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 71 00 00 00 05 00 00 00 00 4e b8 0a - 1196: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 72 00 00 00 05 00 00 00 00 be ac ed - 1197: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 73 00 00 00 05 00 00 00 00 2e a1 71 - 1198: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 74 00 00 00 05 00 00 00 00 1e 87 60 - 1199: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 75 00 00 00 05 00 00 00 00 8e 8a fc - 1200: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 76 00 00 00 05 00 00 00 00 7e 9e 1b - 1201: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 77 00 00 00 05 00 00 00 00 ee 93 87 - 1202: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 78 00 00 00 05 00 00 00 00 1e d2 39 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 14 00 15 00 39 01 15 00 17 00 40 00 00 ef -2022-03-28T17:16:40.167366Z MSG src=74608145, dst=74608145, cmd=1, u1=27.6V, i1=0.21A, p1=5.7W, u2=27.7V, i2=0.23A, p2=6.4W, unknown1=1, unknown2=0 - 1203: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 79 00 00 00 05 00 00 00 00 8e df a5 - 1204: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 7a 00 00 00 05 00 00 00 00 7e cb 42 - 1205: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 7b 00 00 00 05 00 00 00 00 ee c6 de - 1206: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 7c 00 00 00 05 00 00 00 00 de e0 cf - 1207: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 7d 00 00 00 05 00 00 00 00 4e ed 53 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 16 00 14 00 38 01 16 00 17 00 3f 00 00 91 -2022-03-28T17:16:45.188458Z MSG src=74608145, dst=74608145, cmd=1, u1=27.8V, i1=0.2A, p1=5.6W, u2=27.8V, i2=0.23A, p2=6.3W, unknown1=1, unknown2=0 - 1208: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 7e 00 00 00 05 00 00 00 00 be f9 b4 - 1209: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 7f 00 00 00 05 00 00 00 00 2e f4 28 - 1210: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 80 00 00 00 05 00 00 00 00 da b1 66 - 1211: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 81 00 00 00 05 00 00 00 00 4a bc fa - 1212: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 82 00 00 00 05 00 00 00 00 ba a8 1d - 1213: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 83 00 00 00 05 00 00 00 00 2a a5 81 - 1214: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 84 00 00 00 05 00 00 00 00 1a 83 90 - 1215: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 85 00 00 00 05 00 00 00 00 8a 8e 0c -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 15 00 14 00 38 01 18 00 17 00 3f 00 00 9c -2022-03-28T17:16:53.221120Z MSG src=74608145, dst=74608145, cmd=1, u1=27.7V, i1=0.2A, p1=5.6W, u2=28.0V, i2=0.23A, p2=6.3W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 b9 06 7e 06 81 09 31 13 87 00 72 38 -2022-03-28T17:16:53.270345Z MSG src=74608145, dst=74608145, cmd=2, u=235.3V, f=49.99Hz, p=11.4W, uk1=12850, uk2=0, uk3=14265, uk4=1662, uk5=1665 - 1216: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 86 00 00 00 05 00 00 00 00 7a 9a eb - 1217: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 87 00 00 00 05 00 00 00 00 ea 97 77 - 1218: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 88 00 00 00 05 00 00 00 00 1a d6 c9 - 1219: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 89 00 00 00 05 00 00 00 00 8a db 55 -Received 27 bytes on pipe 5: 95 74 60 81 45 74 60 81 45 01 00 01 01 12 00 14 00 37 01 1b 00 16 00 3e 00 00 97 -2022-03-28T17:16:57.236513Z MSG src=74608145, dst=74608145, cmd=1, u1=27.4V, i1=0.2A, p1=5.5W, u2=28.3V, i2=0.22A, p2=6.2W, unknown1=1, unknown2=0 - 1220: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 8a 00 00 00 05 00 00 00 00 7a cf b2 - 1221: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 8b 00 00 00 05 00 00 00 00 ea c2 2e - 1222: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 8c 00 00 00 05 00 00 00 00 da e4 3f - 1223: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 8d 00 00 00 05 00 00 00 00 4a e9 a3 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 14 00 14 00 37 01 16 00 17 00 3f 00 00 9c -2022-03-28T17:17:01.252877Z MSG src=74608145, dst=74608145, cmd=1, u1=27.6V, i1=0.2A, p1=5.5W, u2=27.8V, i2=0.23A, p2=6.3W, unknown1=1, unknown2=0 - 1224: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 8e 00 00 00 05 00 00 00 00 ba fd 44 - 1225: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 8f 00 00 00 05 00 00 00 00 2a f0 d8 - 1226: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 90 00 00 00 05 00 00 00 00 1a 7c 7b - 1227: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 91 00 00 00 05 00 00 00 00 8a 71 e7 - 1228: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 92 00 00 00 05 00 00 00 00 7a 65 00 - 1229: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 93 00 00 00 05 00 00 00 00 ea 68 9c - 1230: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 94 00 00 00 05 00 00 00 00 da 4e 8d -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 13 00 14 00 37 01 12 00 16 00 3d 00 00 9c -2022-03-28T17:17:08.277695Z MSG src=74608145, dst=74608145, cmd=1, u1=27.5V, i1=0.2A, p1=5.5W, u2=27.4V, i2=0.22A, p2=6.1W, unknown1=1, unknown2=0 - 1231: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 95 00 00 00 05 00 00 00 00 4a 43 11 - 1232: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 96 00 00 00 05 00 00 00 00 ba 57 f6 - 1233: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 97 00 00 00 05 00 00 00 00 2a 5a 6a - 1234: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 98 00 00 00 05 00 00 00 00 da 1b d4 - 1235: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 99 00 00 00 05 00 00 00 00 4a 16 48 - 1236: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 9a 00 00 00 05 00 00 00 00 ba 02 af - 1237: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 9b 00 00 00 05 00 00 00 00 2a 0f 33 - 1238: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 9c 00 00 00 05 00 00 00 00 1a 29 22 - 1239: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 9d 00 00 00 05 00 00 00 00 8a 24 be - 1240: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 9e 00 00 00 05 00 00 00 00 7a 30 59 - 1241: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed 9f 00 00 00 05 00 00 00 00 ea 3d c5 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 12 00 14 00 36 01 16 00 16 00 3e 00 00 9b -2022-03-28T17:17:19.321813Z MSG src=74608145, dst=74608145, cmd=1, u1=27.4V, i1=0.2A, p1=5.4W, u2=27.8V, i2=0.22A, p2=6.2W, unknown1=1, unknown2=0 - 1242: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed a0 00 00 00 05 00 00 00 00 1b 28 1e - 1243: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed a1 00 00 00 05 00 00 00 00 8b 25 82 - 1244: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed a2 00 00 00 05 00 00 00 00 7b 31 65 - 1245: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed a3 00 00 00 05 00 00 00 00 eb 3c f9 - 1246: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed a4 00 00 00 05 00 00 00 00 db 1a e8 - 1247: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed a5 00 00 00 05 00 00 00 00 4b 17 74 - 1248: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed a6 00 00 00 05 00 00 00 00 bb 03 93 - 1249: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed a7 00 00 00 05 00 00 00 00 2b 0e 0f - 1250: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed a8 00 00 00 05 00 00 00 00 db 4f b1 - 1251: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed a9 00 00 00 05 00 00 00 00 4b 42 2d - 1252: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed aa 00 00 00 05 00 00 00 00 bb 56 ca - 1253: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed ab 00 00 00 05 00 00 00 00 2b 5b 56 - 1254: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed ac 00 00 00 05 00 00 00 00 1b 7d 47 - 1255: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed ad 00 00 00 05 00 00 00 00 8b 70 db -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 12 00 13 00 35 01 16 00 16 00 3c 00 00 9d -2022-03-28T17:17:33.380293Z MSG src=74608145, dst=74608145, cmd=1, u1=27.4V, i1=0.19A, p1=5.3W, u2=27.8V, i2=0.22A, p2=6.0W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 b9 06 7e 06 81 09 30 13 86 00 6c 26 -2022-03-28T17:17:33.429835Z MSG src=74608145, dst=74608145, cmd=2, u=235.2V, f=49.98Hz, p=10.8W, uk1=12850, uk2=0, uk3=14265, uk4=1662, uk5=1665 -Received 23 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 83 00 00 00 05 03 e8 01 0a 00 06 10 35 d0 -2022-03-28T17:17:33.479201Z MSG src=74608145, dst=74608145, cmd=131, unknown cmd 131 - 1256: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed ae 00 00 00 05 00 00 00 00 7b 64 3c - 1257: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed af 00 00 00 05 00 00 00 00 eb 69 a0 - 1258: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed b0 00 00 00 05 00 00 00 00 db e5 03 - 1259: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed b1 00 00 00 05 00 00 00 00 4b e8 9f - 1260: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed b2 00 00 00 05 00 00 00 00 bb fc 78 - 1261: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed b3 00 00 00 05 00 00 00 00 2b f1 e4 - 1262: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed b4 00 00 00 05 00 00 00 00 1b d7 f5 - 1263: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed b5 00 00 00 05 00 00 00 00 8b da 69 - 1264: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed b6 00 00 00 05 00 00 00 00 7b ce 8e - 1265: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed b7 00 00 00 05 00 00 00 00 eb c3 12 - 1266: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed b8 00 00 00 05 00 00 00 00 1b 82 ac - 1267: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed b9 00 00 00 05 00 00 00 00 8b 8f 30 - 1268: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed ba 00 00 00 05 00 00 00 00 7b 9b d7 - 1269: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed bb 00 00 00 05 00 00 00 00 eb 96 4b - 1270: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed bc 00 00 00 05 00 00 00 00 db b0 5a - 1271: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed bd 00 00 00 05 00 00 00 00 4b bd c6 - 1272: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed be 00 00 00 05 00 00 00 00 bb a9 21 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 11 00 13 00 34 01 17 00 15 00 3b 00 00 9a -2022-03-28T17:17:50.447451Z MSG src=74608145, dst=74608145, cmd=1, u1=27.3V, i1=0.19A, p1=5.2W, u2=27.9V, i2=0.21A, p2=5.9W, unknown1=1, unknown2=0 - 1273: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed bf 00 00 00 05 00 00 00 00 2b a4 bd - 1274: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed c0 00 00 00 05 00 00 00 00 19 80 d4 - 1275: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed c1 00 00 00 05 00 00 00 00 89 8d 48 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 13 00 13 00 34 01 13 00 15 00 3a 00 00 9d -2022-03-28T17:17:53.458022Z MSG src=74608145, dst=74608145, cmd=1, u1=27.5V, i1=0.19A, p1=5.2W, u2=27.5V, i2=0.21A, p2=5.8W, unknown1=1, unknown2=0 - 1276: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed c2 00 00 00 05 00 00 00 00 79 99 af - 1277: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed c3 00 00 00 05 00 00 00 00 e9 94 33 - 1278: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed c4 00 00 00 05 00 00 00 00 d9 b2 22 - 1279: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed c5 00 00 00 05 00 00 00 00 49 bf be - 1280: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed c6 00 00 00 05 00 00 00 00 b9 ab 59 - 1281: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed c7 00 00 00 05 00 00 00 00 29 a6 c5 - 1282: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed c8 00 00 00 05 00 00 00 00 d9 e7 7b - 1283: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed c9 00 00 00 05 00 00 00 00 49 ea e7 - 1284: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed ca 00 00 00 05 00 00 00 00 b9 fe 00 - 1285: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed cb 00 00 00 05 00 00 00 00 29 f3 9c -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 15 00 13 00 33 01 16 00 15 00 3a 00 00 99 -2022-03-28T17:18:03.499197Z MSG src=74608145, dst=74608145, cmd=1, u1=27.7V, i1=0.19A, p1=5.1W, u2=27.8V, i2=0.21A, p2=5.8W, unknown1=1, unknown2=0 - 1286: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed cc 00 00 00 05 00 00 00 00 19 d5 8d - 1287: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed cd 00 00 00 05 00 00 00 00 89 d8 11 - 1288: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed ce 00 00 00 05 00 00 00 00 79 cc f6 - 1289: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed cf 00 00 00 05 00 00 00 00 e9 c1 6a - 1290: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed d0 00 00 00 05 00 00 00 00 d9 4d c9 - 1291: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed d1 00 00 00 05 00 00 00 00 49 40 55 - 1292: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed d2 00 00 00 05 00 00 00 00 b9 54 b2 - 1293: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed d3 00 00 00 05 00 00 00 00 29 59 2e - 1294: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed d4 00 00 00 05 00 00 00 00 19 7f 3f - 1295: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed d5 00 00 00 05 00 00 00 00 89 72 a3 -Received 27 bytes on pipe 5: 95 74 60 81 45 74 60 81 45 01 00 01 01 15 00 12 00 33 01 15 00 15 00 39 00 00 98 -2022-03-28T17:18:13.539328Z MSG src=74608145, dst=74608145, cmd=1, u1=27.7V, i1=0.18A, p1=5.1W, u2=27.7V, i2=0.21A, p2=5.7W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 29 13 87 00 67 35 -2022-03-28T17:18:13.588993Z MSG src=74608145, dst=74608145, cmd=2, u=234.5V, f=49.99Hz, p=10.3W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1296: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed d6 00 00 00 05 00 00 00 00 79 66 44 - 1297: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed d7 00 00 00 05 00 00 00 00 e9 6b d8 - 1298: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed d8 00 00 00 05 00 00 00 00 19 2a 66 - 1299: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed d9 00 00 00 05 00 00 00 00 89 27 fa - 1300: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed da 00 00 00 05 00 00 00 00 79 33 1d - 1301: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed db 00 00 00 05 00 00 00 00 e9 3e 81 - 1302: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed dc 00 00 00 05 00 00 00 00 d9 18 90 - 1303: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed dd 00 00 00 05 00 00 00 00 49 15 0c - 1304: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed de 00 00 00 05 00 00 00 00 b9 01 eb - 1305: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed df 00 00 00 05 00 00 00 00 29 0c 77 - 1306: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed e0 00 00 00 05 00 00 00 00 d8 19 ac - 1307: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed e1 00 00 00 05 00 00 00 00 48 14 30 - 1308: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed e2 00 00 00 05 00 00 00 00 b8 00 d7 - 1309: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed e3 00 00 00 05 00 00 00 00 28 0d 4b - 1310: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed e4 00 00 00 05 00 00 00 00 18 2b 5a - 1311: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed e5 00 00 00 05 00 00 00 00 88 26 c6 - 1312: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed e6 00 00 00 05 00 00 00 00 78 32 21 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 14 00 12 00 32 01 15 00 14 00 38 00 00 98 -2022-03-28T17:18:30.607952Z MSG src=74608145, dst=74608145, cmd=1, u1=27.6V, i1=0.18A, p1=5.0W, u2=27.7V, i2=0.2A, p2=5.6W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 2a 13 86 00 65 35 -2022-03-28T17:18:30.657513Z MSG src=74608145, dst=74608145, cmd=2, u=234.6V, f=49.98Hz, p=10.1W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1313: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed e7 00 00 00 05 00 00 00 00 e8 3f bd - 1314: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed e8 00 00 00 05 00 00 00 00 18 7e 03 - 1315: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed e9 00 00 00 05 00 00 00 00 88 73 9f - 1316: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed ea 00 00 00 05 00 00 00 00 78 67 78 - 1317: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed eb 00 00 00 05 00 00 00 00 e8 6a e4 - 1318: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed ec 00 00 00 05 00 00 00 00 d8 4c f5 - 1319: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed ed 00 00 00 05 00 00 00 00 48 41 69 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 15 00 12 00 31 01 17 00 14 00 38 00 00 98 -2022-03-28T17:18:37.637037Z MSG src=74608145, dst=74608145, cmd=1, u1=27.7V, i1=0.18A, p1=4.9W, u2=27.9V, i2=0.2A, p2=5.6W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 2a 13 86 00 64 34 -2022-03-28T17:18:37.686576Z MSG src=74608145, dst=74608145, cmd=2, u=234.6V, f=49.98Hz, p=10.0W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1320: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed ee 00 00 00 05 00 00 00 00 b8 55 8e - 1321: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed ef 00 00 00 05 00 00 00 00 28 58 12 - 1322: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed f0 00 00 00 05 00 00 00 00 18 d4 b1 - 1323: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed f1 00 00 00 05 00 00 00 00 88 d9 2d - 1324: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed f2 00 00 00 05 00 00 00 00 78 cd ca - 1325: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed f3 00 00 00 05 00 00 00 00 e8 c0 56 - 1326: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed f4 00 00 00 05 00 00 00 00 d8 e6 47 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 14 00 12 00 31 01 15 00 14 00 37 00 00 94 -2022-03-28T17:18:44.666157Z MSG src=74608145, dst=74608145, cmd=1, u1=27.6V, i1=0.18A, p1=4.9W, u2=27.7V, i2=0.2A, p2=5.5W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 2a 13 85 00 63 30 -2022-03-28T17:18:44.715465Z MSG src=74608145, dst=74608145, cmd=2, u=234.6V, f=49.97Hz, p=9.9W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1327: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed f5 00 00 00 05 00 00 00 00 48 eb db - 1328: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed f6 00 00 00 05 00 00 00 00 b8 ff 3c - 1329: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed f7 00 00 00 05 00 00 00 00 28 f2 a0 - 1330: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed f8 00 00 00 05 00 00 00 00 d8 b3 1e - 1331: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed f9 00 00 00 05 00 00 00 00 48 be 82 - 1332: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed fa 00 00 00 05 00 00 00 00 b8 aa 65 - 1333: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed fb 00 00 00 05 00 00 00 00 28 a7 f9 - 1334: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed fc 00 00 00 05 00 00 00 00 18 81 e8 - 1335: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed fd 00 00 00 05 00 00 00 00 88 8c 74 - 1336: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed fe 00 00 00 05 00 00 00 00 78 98 93 - 1337: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ed ff 00 00 00 05 00 00 00 00 e8 95 0f - 1338: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 00 00 00 00 05 00 00 00 00 13 20 bd - 1339: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 01 00 00 00 05 00 00 00 00 83 2d 21 - 1340: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 02 00 00 00 05 00 00 00 00 73 39 c6 - 1341: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 03 00 00 00 05 00 00 00 00 e3 34 5a - 1342: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 04 00 00 00 05 00 00 00 00 d3 12 4b - 1343: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 05 00 00 00 05 00 00 00 00 43 1f d7 - 1344: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 06 00 00 00 05 00 00 00 00 b3 0b 30 - 1345: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 07 00 00 00 05 00 00 00 00 23 06 ac - 1346: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 08 00 00 00 05 00 00 00 00 d3 47 12 - 1347: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 09 00 00 00 05 00 00 00 00 43 4a 8e - 1348: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 0a 00 00 00 05 00 00 00 00 b3 5e 69 - 1349: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 0b 00 00 00 05 00 00 00 00 23 53 f5 - 1350: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 0c 00 00 00 05 00 00 00 00 13 75 e4 - 1351: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 0d 00 00 00 05 00 00 00 00 83 78 78 - 1352: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 0e 00 00 00 05 00 00 00 00 73 6c 9f - 1353: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 0f 00 00 00 05 00 00 00 00 e3 61 03 - 1354: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 10 00 00 00 05 00 00 00 00 d3 ed a0 - 1355: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 11 00 00 00 05 00 00 00 00 43 e0 3c - 1356: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 12 00 00 00 05 00 00 00 00 b3 f4 db - 1357: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 13 00 00 00 05 00 00 00 00 23 f9 47 - 1358: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 14 00 00 00 05 00 00 00 00 13 df 56 - 1359: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 15 00 00 00 05 00 00 00 00 83 d2 ca - 1360: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 16 00 00 00 05 00 00 00 00 73 c6 2d - 1361: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 17 00 00 00 05 00 00 00 00 e3 cb b1 - 1362: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 18 00 00 00 05 00 00 00 00 13 8a 0f - 1363: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 19 00 00 00 05 00 00 00 00 83 87 93 - 1364: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 1a 00 00 00 05 00 00 00 00 73 93 74 - 1365: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 1b 00 00 00 05 00 00 00 00 e3 9e e8 - 1366: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 1c 00 00 00 05 00 00 00 00 d3 b8 f9 - 1367: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 1d 00 00 00 05 00 00 00 00 43 b5 65 - 1368: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 1e 00 00 00 05 00 00 00 00 b3 a1 82 - 1369: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 1f 00 00 00 05 00 00 00 00 23 ac 1e - 1370: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 20 00 00 00 05 00 00 00 00 d2 b9 c5 - 1371: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 21 00 00 00 05 00 00 00 00 42 b4 59 - 1372: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 22 00 00 00 05 00 00 00 00 b2 a0 be - 1373: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 23 00 00 00 05 00 00 00 00 22 ad 22 - 1374: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 24 00 00 00 05 00 00 00 00 12 8b 33 - 1375: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 25 00 00 00 05 00 00 00 00 82 86 af - 1376: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 26 00 00 00 05 00 00 00 00 72 92 48 - 1377: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 27 00 00 00 05 00 00 00 00 e2 9f d4 - 1378: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 28 00 00 00 05 00 00 00 00 12 de 6a - 1379: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 29 00 00 00 05 00 00 00 00 82 d3 f6 - 1380: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 2a 00 00 00 05 00 00 00 00 72 c7 11 - 1381: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 2b 00 00 00 05 00 00 00 00 e2 ca 8d - 1382: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 2c 00 00 00 05 00 00 00 00 d2 ec 9c - 1383: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 2d 00 00 00 05 00 00 00 00 42 e1 00 - 1384: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 2e 00 00 00 05 00 00 00 00 b2 f5 e7 - 1385: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 2f 00 00 00 05 00 00 00 00 22 f8 7b - 1386: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 30 00 00 00 05 00 00 00 00 12 74 d8 - 1387: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 31 00 00 00 05 00 00 00 00 82 79 44 - 1388: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 32 00 00 00 05 00 00 00 00 72 6d a3 - 1389: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 33 00 00 00 05 00 00 00 00 e2 60 3f - 1390: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 34 00 00 00 05 00 00 00 00 d2 46 2e - 1391: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 35 00 00 00 05 00 00 00 00 42 4b b2 - 1392: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 36 00 00 00 05 00 00 00 00 b2 5f 55 - 1393: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 37 00 00 00 05 00 00 00 00 22 52 c9 - 1394: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 38 00 00 00 05 00 00 00 00 d2 13 77 - 1395: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 39 00 00 00 05 00 00 00 00 42 1e eb -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0f 00 10 00 2c 01 14 00 12 00 32 00 00 92 -2022-03-28T17:19:53.938598Z MSG src=74608145, dst=74608145, cmd=1, u1=27.1V, i1=0.16A, p1=4.4W, u2=27.6V, i2=0.18A, p2=5.0W, unknown1=1, unknown2=0 - 1396: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 3a 00 00 00 05 00 00 00 00 b2 0a 0c - 1397: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 3b 00 00 00 05 00 00 00 00 22 07 90 - 1398: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 3c 00 00 00 05 00 00 00 00 12 21 81 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0e 00 10 00 2c 01 14 00 12 00 32 00 00 93 -2022-03-28T17:19:56.948977Z MSG src=74608145, dst=74608145, cmd=1, u1=27.0V, i1=0.16A, p1=4.4W, u2=27.6V, i2=0.18A, p2=5.0W, unknown1=1, unknown2=0 - 1399: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 3d 00 00 00 05 00 00 00 00 82 2c 1d - 1400: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 3e 00 00 00 05 00 00 00 00 72 38 fa - 1401: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 3f 00 00 00 05 00 00 00 00 e2 35 66 - 1402: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 40 00 00 00 05 00 00 00 00 d0 11 0f - 1403: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 41 00 00 00 05 00 00 00 00 40 1c 93 - 1404: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 42 00 00 00 05 00 00 00 00 b0 08 74 - 1405: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 43 00 00 00 05 00 00 00 00 20 05 e8 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0d 00 10 00 2c 01 14 00 12 00 32 00 00 90 -2022-03-28T17:20:03.979760Z MSG src=74608145, dst=74608145, cmd=1, u1=26.9V, i1=0.16A, p1=4.4W, u2=27.6V, i2=0.18A, p2=5.0W, unknown1=1, unknown2=0 - 1406: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 44 00 00 00 05 00 00 00 00 10 23 f9 - 1407: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 45 00 00 00 05 00 00 00 00 80 2e 65 - 1408: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 46 00 00 00 05 00 00 00 00 70 3a 82 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0f 00 10 00 2c 01 13 00 12 00 32 00 00 95 -2022-03-28T17:20:06.990089Z MSG src=74608145, dst=74608145, cmd=1, u1=27.1V, i1=0.16A, p1=4.4W, u2=27.5V, i2=0.18A, p2=5.0W, unknown1=1, unknown2=0 - 1409: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 47 00 00 00 05 00 00 00 00 e0 37 1e - 1410: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 48 00 00 00 05 00 00 00 00 10 76 a0 - 1411: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 49 00 00 00 05 00 00 00 00 80 7b 3c - 1412: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 4a 00 00 00 05 00 00 00 00 70 6f db - 1413: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 4b 00 00 00 05 00 00 00 00 e0 62 47 - 1414: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 4c 00 00 00 05 00 00 00 00 d0 44 56 - 1415: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 4e 00 00 00 05 00 00 00 00 b0 5d 2d - 1416: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 4f 00 00 00 05 00 00 00 00 20 50 b1 - 1417: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 50 00 00 00 05 00 00 00 00 10 dc 12 - 1418: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 51 00 00 00 05 00 00 00 00 80 d1 8e -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 10 00 10 00 2c 01 12 00 12 00 31 00 00 88 -2022-03-28T17:20:17.030935Z MSG src=74608145, dst=74608145, cmd=1, u1=27.2V, i1=0.16A, p1=4.4W, u2=27.4V, i2=0.18A, p2=4.9W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 2e 13 84 00 58 0e -2022-03-28T17:20:17.080177Z MSG src=74608145, dst=74608145, cmd=2, u=235.0V, f=49.96Hz, p=8.8W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1419: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 52 00 00 00 05 00 00 00 00 70 c5 69 - 1420: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 53 00 00 00 05 00 00 00 00 e0 c8 f5 - 1421: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 54 00 00 00 05 00 00 00 00 d0 ee e4 - 1422: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 55 00 00 00 05 00 00 00 00 40 e3 78 - 1423: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 56 00 00 00 05 00 00 00 00 b0 f7 9f - 1424: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 57 00 00 00 05 00 00 00 00 20 fa 03 - 1425: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 58 00 00 00 05 00 00 00 00 d0 bb bd - 1426: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 59 00 00 00 05 00 00 00 00 40 b6 21 - 1427: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 5a 00 00 00 05 00 00 00 00 b0 a2 c6 - 1428: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 5b 00 00 00 05 00 00 00 00 20 af 5a -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 12 00 10 00 2b 01 14 00 12 00 30 00 00 8a -2022-03-28T17:20:27.071128Z MSG src=74608145, dst=74608145, cmd=1, u1=27.4V, i1=0.16A, p1=4.3W, u2=27.6V, i2=0.18A, p2=4.8W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 30 13 84 00 57 1f -2022-03-28T17:20:27.120389Z MSG src=74608145, dst=74608145, cmd=2, u=235.2V, f=49.96Hz, p=8.7W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1429: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 5c 00 00 00 05 00 00 00 00 10 89 4b - 1430: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 5d 00 00 00 05 00 00 00 00 80 84 d7 - 1431: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 5e 00 00 00 05 00 00 00 00 70 90 30 - 1432: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 5f 00 00 00 05 00 00 00 00 e0 9d ac - 1433: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 60 00 00 00 05 00 00 00 00 11 88 77 - 1434: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 61 00 00 00 05 00 00 00 00 81 85 eb - 1435: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 62 00 00 00 05 00 00 00 00 71 91 0c - 1436: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 63 00 00 00 05 00 00 00 00 e1 9c 90 - 1437: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 64 00 00 00 05 00 00 00 00 d1 ba 81 - 1438: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 65 00 00 00 05 00 00 00 00 41 b7 1d - 1439: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 66 00 00 00 05 00 00 00 00 b1 a3 fa - 1440: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 67 00 00 00 05 00 00 00 00 21 ae 66 - 1441: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 68 00 00 00 05 00 00 00 00 d1 ef d8 - 1442: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 69 00 00 00 05 00 00 00 00 41 e2 44 - 1443: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 6a 00 00 00 05 00 00 00 00 b1 f6 a3 - 1444: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 6b 00 00 00 05 00 00 00 00 21 fb 3f - 1445: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 6c 00 00 00 05 00 00 00 00 11 dd 2e - 1446: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 6d 00 00 00 05 00 00 00 00 81 d0 b2 - 1447: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 6e 00 00 00 05 00 00 00 00 71 c4 55 - 1448: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 6f 00 00 00 05 00 00 00 00 e1 c9 c9 - 1449: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 70 00 00 00 05 00 00 00 00 d1 45 6a - 1450: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 71 00 00 00 05 00 00 00 00 41 48 f6 - 1451: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 72 00 00 00 05 00 00 00 00 b1 5c 11 - 1452: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 73 00 00 00 05 00 00 00 00 21 51 8d - 1453: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 74 00 00 00 05 00 00 00 00 11 77 9c - 1454: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 75 00 00 00 05 00 00 00 00 81 7a 00 - 1455: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 76 00 00 00 05 00 00 00 00 71 6e e7 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 12 00 0f 00 29 01 13 00 11 00 2f 00 00 8c -2022-03-28T17:20:54.174823Z MSG src=74608145, dst=74608145, cmd=1, u1=27.4V, i1=0.15A, p1=4.1W, u2=27.5V, i2=0.17A, p2=4.7W, unknown1=1, unknown2=0 - 1456: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 77 00 00 00 05 00 00 00 00 e1 63 7b - 1457: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 78 00 00 00 05 00 00 00 00 11 22 c5 - 1458: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 79 00 00 00 05 00 00 00 00 81 2f 59 - 1459: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 7a 00 00 00 05 00 00 00 00 71 3b be - 1460: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 7b 00 00 00 05 00 00 00 00 e1 36 22 - 1461: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 7c 00 00 00 05 00 00 00 00 d1 10 33 - 1462: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 7d 00 00 00 05 00 00 00 00 41 1d af -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 11 00 0f 00 29 01 12 00 11 00 2e 00 00 8f -2022-03-28T17:21:01.204356Z MSG src=74608145, dst=74608145, cmd=1, u1=27.3V, i1=0.15A, p1=4.1W, u2=27.4V, i2=0.17A, p2=4.6W, unknown1=1, unknown2=0 - 1463: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 7e 00 00 00 05 00 00 00 00 b1 09 48 - 1464: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 7f 00 00 00 05 00 00 00 00 21 04 d4 - 1465: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 80 00 00 00 05 00 00 00 00 d5 41 9a - 1466: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 81 00 00 00 05 00 00 00 00 45 4c 06 - 1467: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 82 00 00 00 05 00 00 00 00 b5 58 e1 - 1468: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 83 00 00 00 05 00 00 00 00 25 55 7d - 1469: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 84 00 00 00 05 00 00 00 00 15 73 6c -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 11 00 0f 00 29 01 13 00 11 00 2e 00 00 8e -2022-03-28T17:21:08.233625Z MSG src=74608145, dst=74608145, cmd=1, u1=27.3V, i1=0.15A, p1=4.1W, u2=27.5V, i2=0.17A, p2=4.6W, unknown1=1, unknown2=0 - 1470: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 85 00 00 00 05 00 00 00 00 85 7e f0 - 1471: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 86 00 00 00 05 00 00 00 00 75 6a 17 - 1472: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 87 00 00 00 05 00 00 00 00 e5 67 8b -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 11 00 0f 00 29 01 14 00 11 00 2e 00 00 89 -2022-03-28T17:21:11.243675Z MSG src=74608145, dst=74608145, cmd=1, u1=27.3V, i1=0.15A, p1=4.1W, u2=27.6V, i2=0.17A, p2=4.6W, unknown1=1, unknown2=0 - 1473: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 88 00 00 00 05 00 00 00 00 15 26 35 - 1474: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 89 00 00 00 05 00 00 00 00 85 2b a9 - 1475: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 8a 00 00 00 05 00 00 00 00 75 3f 4e - 1476: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 8b 00 00 00 05 00 00 00 00 e5 32 d2 - 1477: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 8c 00 00 00 05 00 00 00 00 d5 14 c3 - 1478: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 8d 00 00 00 05 00 00 00 00 45 19 5f - 1479: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 8e 00 00 00 05 00 00 00 00 b5 0d b8 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0f 00 0f 00 28 01 12 00 11 00 2d 00 00 93 -2022-03-28T17:21:18.272586Z MSG src=74608145, dst=74608145, cmd=1, u1=27.1V, i1=0.15A, p1=4.0W, u2=27.4V, i2=0.17A, p2=4.5W, unknown1=1, unknown2=0 - 1480: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 8f 00 00 00 05 00 00 00 00 25 00 24 - 1481: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 90 00 00 00 05 00 00 00 00 15 8c 87 - 1482: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 91 00 00 00 05 00 00 00 00 85 81 1b - 1483: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 92 00 00 00 05 00 00 00 00 75 95 fc - 1484: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 93 00 00 00 05 00 00 00 00 e5 98 60 - 1485: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 94 00 00 00 05 00 00 00 00 d5 be 71 - 1486: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 95 00 00 00 05 00 00 00 00 45 b3 ed -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 10 00 0f 00 28 01 10 00 10 00 2d 00 00 8f -2022-03-28T17:21:25.302129Z MSG src=74608145, dst=74608145, cmd=1, u1=27.2V, i1=0.15A, p1=4.0W, u2=27.2V, i2=0.16A, p2=4.5W, unknown1=1, unknown2=0 - 1487: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 96 00 00 00 05 00 00 00 00 b5 a7 0a - 1488: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 97 00 00 00 05 00 00 00 00 25 aa 96 - 1489: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 98 00 00 00 05 00 00 00 00 d5 eb 28 - 1490: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 99 00 00 00 05 00 00 00 00 45 e6 b4 - 1491: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 9a 00 00 00 05 00 00 00 00 b5 f2 53 - 1492: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 9b 00 00 00 05 00 00 00 00 25 ff cf - 1493: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 9c 00 00 00 05 00 00 00 00 15 d9 de - 1494: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 9d 00 00 00 05 00 00 00 00 85 d4 42 - 1495: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 9e 00 00 00 05 00 00 00 00 75 c0 a5 - 1496: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee 9f 00 00 00 05 00 00 00 00 e5 cd 39 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 10 00 0e 00 27 01 0f 00 10 00 2c 00 00 9f -2022-03-28T17:21:35.340516Z MSG src=74608145, dst=74608145, cmd=1, u1=27.2V, i1=0.14A, p1=3.9W, u2=27.1V, i2=0.16A, p2=4.4W, unknown1=1, unknown2=0 - 1497: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee a0 00 00 00 05 00 00 00 00 14 d8 e2 - 1498: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee a1 00 00 00 05 00 00 00 00 84 d5 7e - 1499: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee a2 00 00 00 05 00 00 00 00 74 c1 99 - 1500: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee a3 00 00 00 05 00 00 00 00 e4 cc 05 - 1501: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee a4 00 00 00 05 00 00 00 00 d4 ea 14 - 1502: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee a5 00 00 00 05 00 00 00 00 44 e7 88 - 1503: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee a6 00 00 00 05 00 00 00 00 b4 f3 6f -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 11 00 0e 00 27 01 10 00 10 00 2c 00 00 81 -2022-03-28T17:21:42.369528Z MSG src=74608145, dst=74608145, cmd=1, u1=27.3V, i1=0.14A, p1=3.9W, u2=27.2V, i2=0.16A, p2=4.4W, unknown1=1, unknown2=0 - 1504: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee a7 00 00 00 05 00 00 00 00 24 fe f3 - 1505: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee a8 00 00 00 05 00 00 00 00 d4 bf 4d - 1506: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee a9 00 00 00 05 00 00 00 00 44 b2 d1 - 1507: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee aa 00 00 00 05 00 00 00 00 b4 a6 36 - 1508: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee ab 00 00 00 05 00 00 00 00 24 ab aa - 1509: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee ac 00 00 00 05 00 00 00 00 14 8d bb - 1510: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee ad 00 00 00 05 00 00 00 00 84 80 27 - 1511: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee ae 00 00 00 05 00 00 00 00 74 94 c0 - 1512: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee af 00 00 00 05 00 00 00 00 e4 99 5c - 1513: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee b0 00 00 00 05 00 00 00 00 d4 15 ff -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 10 00 0e 00 27 01 11 00 10 00 2b 00 00 86 -2022-03-28T17:21:52.408068Z MSG src=74608145, dst=74608145, cmd=1, u1=27.2V, i1=0.14A, p1=3.9W, u2=27.3V, i2=0.16A, p2=4.3W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 5: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 2f 13 85 00 4e 18 -2022-03-28T17:21:52.457594Z MSG src=74608145, dst=74608145, cmd=2, u=235.1V, f=49.97Hz, p=7.8W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1514: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee b1 00 00 00 05 00 00 00 00 44 18 63 - 1515: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee b2 00 00 00 05 00 00 00 00 b4 0c 84 - 1516: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee b3 00 00 00 05 00 00 00 00 24 01 18 - 1517: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee b4 00 00 00 05 00 00 00 00 14 27 09 - 1518: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee b5 00 00 00 05 00 00 00 00 84 2a 95 - 1519: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee b6 00 00 00 05 00 00 00 00 74 3e 72 - 1520: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee b7 00 00 00 05 00 00 00 00 e4 33 ee -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0f 00 0e 00 26 01 12 00 10 00 2b 00 00 9b -2022-03-28T17:21:59.437278Z MSG src=74608145, dst=74608145, cmd=1, u1=27.1V, i1=0.14A, p1=3.8W, u2=27.4V, i2=0.16A, p2=4.3W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 30 13 85 00 4d 04 -2022-03-28T17:21:59.486514Z MSG src=74608145, dst=74608145, cmd=2, u=235.2V, f=49.97Hz, p=7.7W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1521: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee b8 00 00 00 05 00 00 00 00 14 72 50 - 1522: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee b9 00 00 00 05 00 00 00 00 84 7f cc - 1523: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee ba 00 00 00 05 00 00 00 00 74 6b 2b - 1524: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee bb 00 00 00 05 00 00 00 00 e4 66 b7 - 1525: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee bc 00 00 00 05 00 00 00 00 d4 40 a6 - 1526: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee bd 00 00 00 05 00 00 00 00 44 4d 3a - 1527: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee be 00 00 00 05 00 00 00 00 b4 59 dd -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0e 00 0e 00 26 01 11 00 10 00 2b 00 00 99 -2022-03-28T17:22:06.465881Z MSG src=74608145, dst=74608145, cmd=1, u1=27.0V, i1=0.14A, p1=3.8W, u2=27.3V, i2=0.16A, p2=4.3W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 30 13 86 00 4d 07 -2022-03-28T17:22:06.515440Z MSG src=74608145, dst=74608145, cmd=2, u=235.2V, f=49.98Hz, p=7.7W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1528: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee bf 00 00 00 05 00 00 00 00 24 54 41 - 1529: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee c0 00 00 00 05 00 00 00 00 16 70 28 - 1530: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee c1 00 00 00 05 00 00 00 00 86 7d b4 - 1531: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee c2 00 00 00 05 00 00 00 00 76 69 53 - 1532: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee c3 00 00 00 05 00 00 00 00 e6 64 cf - 1533: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee c4 00 00 00 05 00 00 00 00 d6 42 de - 1534: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee c5 00 00 00 05 00 00 00 00 46 4f 42 - 1535: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee c6 00 00 00 05 00 00 00 00 b6 5b a5 - 1536: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee c7 00 00 00 05 00 00 00 00 26 56 39 - 1537: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee c8 00 00 00 05 00 00 00 00 d6 17 87 - 1538: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee c9 00 00 00 05 00 00 00 00 46 1a 1b - 1539: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee ca 00 00 00 05 00 00 00 00 b6 0e fc - 1540: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee cb 00 00 00 05 00 00 00 00 26 03 60 - 1541: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee cc 00 00 00 05 00 00 00 00 16 25 71 - 1542: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee cd 00 00 00 05 00 00 00 00 86 28 ed - 1543: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee ce 00 00 00 05 00 00 00 00 76 3c 0a - 1544: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee cf 00 00 00 05 00 00 00 00 e6 31 96 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0f 00 0e 00 25 01 0f 00 0f 00 2a 00 00 9b -2022-03-28T17:22:23.533332Z MSG src=74608145, dst=74608145, cmd=1, u1=27.1V, i1=0.14A, p1=3.7W, u2=27.1V, i2=0.15A, p2=4.2W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 2e 13 84 00 4b 1d -2022-03-28T17:22:23.582560Z MSG src=74608145, dst=74608145, cmd=2, u=235.0V, f=49.96Hz, p=7.5W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1545: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee d0 00 00 00 05 00 00 00 00 d6 bd 35 - 1546: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee d1 00 00 00 05 00 00 00 00 46 b0 a9 - 1547: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee d2 00 00 00 05 00 00 00 00 b6 a4 4e - 1548: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee d3 00 00 00 05 00 00 00 00 26 a9 d2 - 1549: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee d4 00 00 00 05 00 00 00 00 16 8f c3 - 1550: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee d5 00 00 00 05 00 00 00 00 86 82 5f - 1551: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee d6 00 00 00 05 00 00 00 00 76 96 b8 - 1552: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee d7 00 00 00 05 00 00 00 00 e6 9b 24 - 1553: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee d8 00 00 00 05 00 00 00 00 16 da 9a - 1554: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee d9 00 00 00 05 00 00 00 00 86 d7 06 - 1555: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee da 00 00 00 05 00 00 00 00 76 c3 e1 - 1556: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee db 00 00 00 05 00 00 00 00 e6 ce 7d - 1557: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee dc 00 00 00 05 00 00 00 00 d6 e8 6c - 1558: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee dd 00 00 00 05 00 00 00 00 46 e5 f0 - 1559: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee de 00 00 00 05 00 00 00 00 b6 f1 17 - 1560: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee df 00 00 00 05 00 00 00 00 26 fc 8b - 1561: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee e0 00 00 00 05 00 00 00 00 d7 e9 50 - 1562: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee e1 00 00 00 05 00 00 00 00 47 e4 cc - 1563: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee e2 00 00 00 05 00 00 00 00 b7 f0 2b - 1564: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee e3 00 00 00 05 00 00 00 00 27 fd b7 - 1565: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee e4 00 00 00 05 00 00 00 00 17 db a6 - 1566: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee e5 00 00 00 05 00 00 00 00 87 d6 3a - 1567: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee e6 00 00 00 05 00 00 00 00 77 c2 dd - 1568: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee e7 00 00 00 05 00 00 00 00 e7 cf 41 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0d 00 0d 00 24 01 11 00 0f 00 29 00 00 86 -2022-03-28T17:22:47.628683Z MSG src=74608145, dst=74608145, cmd=1, u1=26.9V, i1=0.13A, p1=3.6W, u2=27.3V, i2=0.15A, p2=4.1W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 2f 13 85 00 49 1f -2022-03-28T17:22:47.678290Z MSG src=74608145, dst=74608145, cmd=2, u=235.1V, f=49.97Hz, p=7.3W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1569: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee e8 00 00 00 05 00 00 00 00 17 8e ff - 1570: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee e9 00 00 00 05 00 00 00 00 87 83 63 - 1571: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee ea 00 00 00 05 00 00 00 00 77 97 84 - 1572: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee eb 00 00 00 05 00 00 00 00 e7 9a 18 - 1573: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee ec 00 00 00 05 00 00 00 00 d7 bc 09 - 1574: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee ed 00 00 00 05 00 00 00 00 47 b1 95 - 1575: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee ee 00 00 00 05 00 00 00 00 b7 a5 72 - 1576: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee ef 00 00 00 05 00 00 00 00 27 a8 ee - 1577: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee f0 00 00 00 05 00 00 00 00 17 24 4d - 1578: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee f1 00 00 00 05 00 00 00 00 87 29 d1 - 1579: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee f2 00 00 00 05 00 00 00 00 77 3d 36 - 1580: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee f3 00 00 00 05 00 00 00 00 e7 30 aa - 1581: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee f4 00 00 00 05 00 00 00 00 d7 16 bb - 1582: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee f5 00 00 00 05 00 00 00 00 47 1b 27 - 1583: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee f6 00 00 00 05 00 00 00 00 b7 0f c0 - 1584: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee f7 00 00 00 05 00 00 00 00 27 02 5c - 1585: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee f8 00 00 00 05 00 00 00 00 d7 43 e2 - 1586: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee f9 00 00 00 05 00 00 00 00 47 4e 7e - 1587: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee fa 00 00 00 05 00 00 00 00 b7 5a 99 - 1588: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee fb 00 00 00 05 00 00 00 00 27 57 05 - 1589: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee fc 00 00 00 05 00 00 00 00 17 71 14 - 1590: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee fd 00 00 00 05 00 00 00 00 87 7c 88 - 1591: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee fe 00 00 00 05 00 00 00 00 77 68 6f - 1592: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ee ff 00 00 00 05 00 00 00 00 e7 65 f3 - 1593: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 00 00 00 00 05 00 00 00 00 d6 71 28 - 1594: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 01 00 00 00 05 00 00 00 00 46 7c b4 - 1595: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 02 00 00 00 05 00 00 00 00 b6 68 53 - 1596: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 03 00 00 00 05 00 00 00 00 26 65 cf - 1597: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 04 00 00 00 05 00 00 00 00 16 43 de - 1598: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 05 00 00 00 05 00 00 00 00 86 4e 42 - 1599: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 06 00 00 00 05 00 00 00 00 76 5a a5 - 1600: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 07 00 00 00 05 00 00 00 00 e6 57 39 - 1601: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 08 00 00 00 05 00 00 00 00 16 16 87 - 1602: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 09 00 00 00 05 00 00 00 00 86 1b 1b - 1603: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 0a 00 00 00 05 00 00 00 00 76 0f fc - 1604: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 0b 00 00 00 05 00 00 00 00 e6 02 60 - 1605: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 0c 00 00 00 05 00 00 00 00 d6 24 71 - 1606: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 0d 00 00 00 05 00 00 00 00 46 29 ed - 1607: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 0e 00 00 00 05 00 00 00 00 b6 3d 0a - 1608: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 0f 00 00 00 05 00 00 00 00 26 30 96 - 1609: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 10 00 00 00 05 00 00 00 00 16 bc 35 - 1610: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 11 00 00 00 05 00 00 00 00 86 b1 a9 - 1611: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 12 00 00 00 05 00 00 00 00 76 a5 4e - 1612: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 13 00 00 00 05 00 00 00 00 e6 a8 d2 - 1613: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 14 00 00 00 05 00 00 00 00 d6 8e c3 - 1614: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 15 00 00 00 05 00 00 00 00 46 83 5f - 1615: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 16 00 00 00 05 00 00 00 00 b6 97 b8 - 1616: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 17 00 00 00 05 00 00 00 00 26 9a 24 - 1617: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 18 00 00 00 05 00 00 00 00 d6 db 9a - 1618: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 19 00 00 00 05 00 00 00 00 46 d6 06 - 1619: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 1a 00 00 00 05 00 00 00 00 b6 c2 e1 - 1620: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 1b 00 00 00 05 00 00 00 00 26 cf 7d - 1621: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 1c 00 00 00 05 00 00 00 00 16 e9 6c - 1622: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 1d 00 00 00 05 00 00 00 00 86 e4 f0 - 1623: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 1e 00 00 00 05 00 00 00 00 76 f0 17 - 1624: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 1f 00 00 00 05 00 00 00 00 e6 fd 8b - 1625: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 20 00 00 00 05 00 00 00 00 17 e8 50 - 1626: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 21 00 00 00 05 00 00 00 00 87 e5 cc - 1627: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 22 00 00 00 05 00 00 00 00 77 f1 2b - 1628: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 23 00 00 00 05 00 00 00 00 e7 fc b7 - 1629: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 24 00 00 00 05 00 00 00 00 d7 da a6 - 1630: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 25 00 00 00 05 00 00 00 00 47 d7 3a - 1631: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 26 00 00 00 05 00 00 00 00 b7 c3 dd - 1632: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 27 00 00 00 05 00 00 00 00 27 ce 41 - 1633: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 28 00 00 00 05 00 00 00 00 d7 8f ff - 1634: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 29 00 00 00 05 00 00 00 00 47 82 63 - 1635: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 2a 00 00 00 05 00 00 00 00 b7 96 84 - 1636: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 2b 00 00 00 05 00 00 00 00 27 9b 18 - 1637: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 2c 00 00 00 05 00 00 00 00 17 bd 09 - 1638: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 2d 00 00 00 05 00 00 00 00 87 b0 95 - 1639: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 2e 00 00 00 05 00 00 00 00 77 a4 72 - 1640: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 2f 00 00 00 05 00 00 00 00 e7 a9 ee - 1641: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 30 00 00 00 05 00 00 00 00 d7 25 4d - 1642: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 31 00 00 00 05 00 00 00 00 47 28 d1 - 1643: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 32 00 00 00 05 00 00 00 00 b7 3c 36 - 1644: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 33 00 00 00 05 00 00 00 00 27 31 aa - 1645: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 34 00 00 00 05 00 00 00 00 17 17 bb - 1646: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 35 00 00 00 05 00 00 00 00 87 1a 27 - 1647: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 36 00 00 00 05 00 00 00 00 77 0e c0 - 1648: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 37 00 00 00 05 00 00 00 00 e7 03 5c - 1649: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 38 00 00 00 05 00 00 00 00 17 42 e2 - 1650: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 39 00 00 00 05 00 00 00 00 87 4f 7e - 1651: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 3a 00 00 00 05 00 00 00 00 77 5b 99 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0c 00 0c 00 21 01 0f 00 0e 00 25 00 00 90 -2022-03-28T17:24:10.960988Z MSG src=74608145, dst=74608145, cmd=1, u1=26.8V, i1=0.12A, p1=3.3W, u2=27.1V, i2=0.14A, p2=3.7W, unknown1=1, unknown2=0 - 1652: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 3b 00 00 00 05 00 00 00 00 e7 56 05 - 1653: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 3c 00 00 00 05 00 00 00 00 d7 70 14 - 1654: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 3d 00 00 00 05 00 00 00 00 47 7d 88 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0e 00 0c 00 20 01 0f 00 0e 00 25 00 00 93 -2022-03-28T17:24:13.971052Z MSG src=74608145, dst=74608145, cmd=1, u1=27.0V, i1=0.12A, p1=3.2W, u2=27.1V, i2=0.14A, p2=3.7W, unknown1=1, unknown2=0 - 1655: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 3e 00 00 00 05 00 00 00 00 b7 69 6f - 1656: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 3f 00 00 00 05 00 00 00 00 27 64 f3 - 1657: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 40 00 00 00 05 00 00 00 00 15 40 9a - 1658: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 41 00 00 00 05 00 00 00 00 85 4d 06 - 1659: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 42 00 00 00 05 00 00 00 00 75 59 e1 - 1660: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 43 00 00 00 05 00 00 00 00 e5 54 7d - 1661: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 44 00 00 00 05 00 00 00 00 d5 72 6c -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0c 00 0c 00 20 01 0e 00 0d 00 24 00 00 92 -2022-03-28T17:24:21.002010Z MSG src=74608145, dst=74608145, cmd=1, u1=26.8V, i1=0.12A, p1=3.2W, u2=27.0V, i2=0.13A, p2=3.6W, unknown1=1, unknown2=0 - 1662: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 45 00 00 00 05 00 00 00 00 45 7f f0 - 1663: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 46 00 00 00 05 00 00 00 00 b5 6b 17 - 1664: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 47 00 00 00 05 00 00 00 00 25 66 8b -Received 27 bytes on pipe 5: 95 74 60 81 45 74 60 81 45 01 00 01 01 0d 00 0c 00 20 01 0e 00 0d 00 24 00 00 93 -2022-03-28T17:24:24.012372Z MSG src=74608145, dst=74608145, cmd=1, u1=26.9V, i1=0.12A, p1=3.2W, u2=27.0V, i2=0.13A, p2=3.6W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 32 13 85 00 41 0a -2022-03-28T17:24:24.061939Z MSG src=74608145, dst=74608145, cmd=2, u=235.4V, f=49.97Hz, p=6.5W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1665: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 48 00 00 00 05 00 00 00 00 d5 27 35 - 1666: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 4a 00 00 00 05 00 00 00 00 b5 3e 4e - 1667: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 4b 00 00 00 05 00 00 00 00 25 33 d2 - 1668: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 4c 00 00 00 05 00 00 00 00 15 15 c3 - 1669: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 4d 00 00 00 05 00 00 00 00 85 18 5f - 1670: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 4e 00 00 00 05 00 00 00 00 75 0c b8 - 1671: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 4f 00 00 00 05 00 00 00 00 e5 01 24 - 1672: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 50 00 00 00 05 00 00 00 00 d5 8d 87 - 1673: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 51 00 00 00 05 00 00 00 00 45 80 1b - 1674: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 52 00 00 00 05 00 00 00 00 b5 94 fc -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0e 00 0c 00 20 01 0e 00 0d 00 24 00 00 90 -2022-03-28T17:24:34.053802Z MSG src=74608145, dst=74608145, cmd=1, u1=27.0V, i1=0.12A, p1=3.2W, u2=27.0V, i2=0.13A, p2=3.6W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 30 13 85 00 40 09 -2022-03-28T17:24:34.103041Z MSG src=74608145, dst=74608145, cmd=2, u=235.2V, f=49.97Hz, p=6.4W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1675: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 53 00 00 00 05 00 00 00 00 25 99 60 - 1676: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 54 00 00 00 05 00 00 00 00 15 bf 71 - 1677: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 55 00 00 00 05 00 00 00 00 85 b2 ed - 1678: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 56 00 00 00 05 00 00 00 00 75 a6 0a - 1679: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 57 00 00 00 05 00 00 00 00 e5 ab 96 - 1680: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 58 00 00 00 05 00 00 00 00 15 ea 28 - 1681: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 59 00 00 00 05 00 00 00 00 85 e7 b4 - 1682: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 5a 00 00 00 05 00 00 00 00 75 f3 53 - 1683: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 5b 00 00 00 05 00 00 00 00 e5 fe cf - 1684: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 5c 00 00 00 05 00 00 00 00 d5 d8 de - 1685: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 5d 00 00 00 05 00 00 00 00 45 d5 42 - 1686: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 5e 00 00 00 05 00 00 00 00 b5 c1 a5 - 1687: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 5f 00 00 00 05 00 00 00 00 25 cc 39 - 1688: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 60 00 00 00 05 00 00 00 00 d4 d9 e2 - 1689: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 61 00 00 00 05 00 00 00 00 44 d4 7e - 1690: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 62 00 00 00 05 00 00 00 00 b4 c0 99 - 1691: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 63 00 00 00 05 00 00 00 00 24 cd 05 - 1692: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 64 00 00 00 05 00 00 00 00 14 eb 14 - 1693: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 65 00 00 00 05 00 00 00 00 84 e6 88 - 1694: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 66 00 00 00 05 00 00 00 00 74 f2 6f - 1695: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 67 00 00 00 05 00 00 00 00 e4 ff f3 - 1696: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 68 00 00 00 05 00 00 00 00 14 be 4d - 1697: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 69 00 00 00 05 00 00 00 00 84 b3 d1 - 1698: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 6a 00 00 00 05 00 00 00 00 74 a7 36 - 1699: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 6b 00 00 00 05 00 00 00 00 e4 aa aa - 1700: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 6c 00 00 00 05 00 00 00 00 d4 8c bb - 1701: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 6d 00 00 00 05 00 00 00 00 44 81 27 - 1702: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 6e 00 00 00 05 00 00 00 00 b4 95 c0 - 1703: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 6f 00 00 00 05 00 00 00 00 24 98 5c - 1704: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 70 00 00 00 05 00 00 00 00 14 14 ff -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0d 00 0b 00 1f 01 0d 00 0d 00 22 00 00 ae -2022-03-28T17:25:04.170557Z MSG src=74608145, dst=74608145, cmd=1, u1=26.9V, i1=0.11A, p1=3.1W, u2=26.9V, i2=0.13A, p2=3.4W, unknown1=1, unknown2=0 - 1705: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 71 00 00 00 05 00 00 00 00 84 19 63 - 1706: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 72 00 00 00 05 00 00 00 00 74 0d 84 - 1707: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 73 00 00 00 05 00 00 00 00 e4 00 18 - 1708: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 74 00 00 00 05 00 00 00 00 d4 26 09 - 1709: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 75 00 00 00 05 00 00 00 00 44 2b 95 - 1710: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 76 00 00 00 05 00 00 00 00 b4 3f 72 - 1711: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 77 00 00 00 05 00 00 00 00 24 32 ee -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0c 00 0b 00 1e 01 0c 00 0d 00 22 00 00 af -2022-03-28T17:25:11.200852Z MSG src=74608145, dst=74608145, cmd=1, u1=26.8V, i1=0.11A, p1=3.0W, u2=26.8V, i2=0.13A, p2=3.4W, unknown1=1, unknown2=0 - 1712: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 78 00 00 00 05 00 00 00 00 d4 73 50 - 1713: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 79 00 00 00 05 00 00 00 00 44 7e cc - 1714: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 7a 00 00 00 05 00 00 00 00 b4 6a 2b -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0d 00 0b 00 1e 01 0c 00 0d 00 22 00 00 ae -2022-03-28T17:25:14.211044Z MSG src=74608145, dst=74608145, cmd=1, u1=26.9V, i1=0.11A, p1=3.0W, u2=26.8V, i2=0.13A, p2=3.4W, unknown1=1, unknown2=0 - 1715: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 7b 00 00 00 05 00 00 00 00 24 67 b7 - 1716: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 7c 00 00 00 05 00 00 00 00 14 41 a6 - 1717: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 7d 00 00 00 05 00 00 00 00 84 4c 3a - 1718: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 7e 00 00 00 05 00 00 00 00 74 58 dd - 1719: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 7f 00 00 00 05 00 00 00 00 e4 55 41 - 1720: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 80 00 00 00 05 00 00 00 00 10 10 0f - 1721: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 81 00 00 00 05 00 00 00 00 80 1d 93 - 1722: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 82 00 00 00 05 00 00 00 00 70 09 74 - 1723: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 83 00 00 00 05 00 00 00 00 e0 04 e8 - 1724: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 84 00 00 00 05 00 00 00 00 d0 22 f9 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0d 00 0b 00 1e 01 0e 00 0c 00 22 00 00 ad -2022-03-28T17:25:24.251140Z MSG src=74608145, dst=74608145, cmd=1, u1=26.9V, i1=0.11A, p1=3.0W, u2=27.0V, i2=0.12A, p2=3.4W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 2f 13 86 00 3d 68 -2022-03-28T17:25:24.300829Z MSG src=74608145, dst=74608145, cmd=2, u=235.1V, f=49.98Hz, p=6.1W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1725: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 85 00 00 00 05 00 00 00 00 40 2f 65 - 1726: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 86 00 00 00 05 00 00 00 00 b0 3b 82 - 1727: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 87 00 00 00 05 00 00 00 00 20 36 1e - 1728: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 88 00 00 00 05 00 00 00 00 d0 77 a0 - 1729: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 89 00 00 00 05 00 00 00 00 40 7a 3c - 1730: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 8a 00 00 00 05 00 00 00 00 b0 6e db - 1731: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 8b 00 00 00 05 00 00 00 00 20 63 47 - 1732: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 8c 00 00 00 05 00 00 00 00 10 45 56 - 1733: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 8d 00 00 00 05 00 00 00 00 80 48 ca - 1734: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 8e 00 00 00 05 00 00 00 00 70 5c 2d -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0b 00 0b 00 1d 01 0d 00 0c 00 21 00 00 a8 -2022-03-28T17:25:34.291213Z MSG src=74608145, dst=74608145, cmd=1, u1=26.7V, i1=0.11A, p1=2.9W, u2=26.9V, i2=0.12A, p2=3.3W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 30 13 85 00 3c 75 -2022-03-28T17:25:34.340787Z MSG src=74608145, dst=74608145, cmd=2, u=235.2V, f=49.97Hz, p=6.0W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1735: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 8f 00 00 00 05 00 00 00 00 e0 51 b1 - 1736: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 90 00 00 00 05 00 00 00 00 d0 dd 12 - 1737: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 91 00 00 00 05 00 00 00 00 40 d0 8e - 1738: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 92 00 00 00 05 00 00 00 00 b0 c4 69 - 1739: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 93 00 00 00 05 00 00 00 00 20 c9 f5 - 1740: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 94 00 00 00 05 00 00 00 00 10 ef e4 - 1741: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 95 00 00 00 05 00 00 00 00 80 e2 78 - 1742: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 96 00 00 00 05 00 00 00 00 70 f6 9f - 1743: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 97 00 00 00 05 00 00 00 00 e0 fb 03 - 1744: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 98 00 00 00 05 00 00 00 00 10 ba bd - 1745: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 99 00 00 00 05 00 00 00 00 80 b7 21 - 1746: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 9a 00 00 00 05 00 00 00 00 70 a3 c6 - 1747: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 9b 00 00 00 05 00 00 00 00 e0 ae 5a - 1748: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 9c 00 00 00 05 00 00 00 00 d0 88 4b - 1749: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 9d 00 00 00 05 00 00 00 00 40 85 d7 - 1750: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 9e 00 00 00 05 00 00 00 00 b0 91 30 - 1751: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef 9f 00 00 00 05 00 00 00 00 20 9c ac - 1752: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef a0 00 00 00 05 00 00 00 00 d1 89 77 - 1753: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef a1 00 00 00 05 00 00 00 00 41 84 eb - 1754: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef a2 00 00 00 05 00 00 00 00 b1 90 0c - 1755: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef a3 00 00 00 05 00 00 00 00 21 9d 90 - 1756: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef a4 00 00 00 05 00 00 00 00 11 bb 81 - 1757: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef a5 00 00 00 05 00 00 00 00 81 b6 1d - 1758: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef a6 00 00 00 05 00 00 00 00 71 a2 fa - 1759: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef a7 00 00 00 05 00 00 00 00 e1 af 66 - 1760: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef a8 00 00 00 05 00 00 00 00 11 ee d8 - 1761: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef a9 00 00 00 05 00 00 00 00 81 e3 44 - 1762: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef aa 00 00 00 05 00 00 00 00 71 f7 a3 - 1763: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef ab 00 00 00 05 00 00 00 00 e1 fa 3f - 1764: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef ac 00 00 00 05 00 00 00 00 d1 dc 2e - 1765: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef ad 00 00 00 05 00 00 00 00 41 d1 b2 - 1766: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef ae 00 00 00 05 00 00 00 00 b1 c5 55 - 1767: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef af 00 00 00 05 00 00 00 00 21 c8 c9 - 1768: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef b0 00 00 00 05 00 00 00 00 11 44 6a - 1769: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef b1 00 00 00 05 00 00 00 00 81 49 f6 - 1770: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef b2 00 00 00 05 00 00 00 00 71 5d 11 - 1771: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef b3 00 00 00 05 00 00 00 00 e1 50 8d - 1772: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef b4 00 00 00 05 00 00 00 00 d1 76 9c - 1773: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef b5 00 00 00 05 00 00 00 00 41 7b 00 - 1774: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef b6 00 00 00 05 00 00 00 00 b1 6f e7 - 1775: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef b7 00 00 00 05 00 00 00 00 21 62 7b - 1776: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef b8 00 00 00 05 00 00 00 00 d1 23 c5 - 1777: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef b9 00 00 00 05 00 00 00 00 41 2e 59 - 1778: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef ba 00 00 00 05 00 00 00 00 b1 3a be -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0a 00 0a 00 1c 01 0c 00 0c 00 1f 00 00 96 -2022-03-28T17:26:18.465098Z MSG src=74608145, dst=74608145, cmd=1, u1=26.6V, i1=0.1A, p1=2.8W, u2=26.8V, i2=0.12A, p2=3.1W, unknown1=1, unknown2=0 - 1779: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef bb 00 00 00 05 00 00 00 00 21 37 22 - 1780: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef bc 00 00 00 05 00 00 00 00 11 11 33 - 1781: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef bd 00 00 00 05 00 00 00 00 81 1c af - 1782: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef be 00 00 00 05 00 00 00 00 71 08 48 - 1783: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef bf 00 00 00 05 00 00 00 00 e1 05 d4 - 1784: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef c0 00 00 00 05 00 00 00 00 d3 21 bd - 1785: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef c1 00 00 00 05 00 00 00 00 43 2c 21 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 09 00 0a 00 1c 01 0b 00 0c 00 1f 00 00 92 -2022-03-28T17:26:25.494739Z MSG src=74608145, dst=74608145, cmd=1, u1=26.5V, i1=0.1A, p1=2.8W, u2=26.7V, i2=0.12A, p2=3.1W, unknown1=1, unknown2=0 - 1786: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef c2 00 00 00 05 00 00 00 00 b3 38 c6 - 1787: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef c3 00 00 00 05 00 00 00 00 23 35 5a - 1788: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef c4 00 00 00 05 00 00 00 00 13 13 4b -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0b 00 0a 00 1b 01 0b 00 0c 00 1f 00 00 97 -2022-03-28T17:26:28.504581Z MSG src=74608145, dst=74608145, cmd=1, u1=26.7V, i1=0.1A, p1=2.7W, u2=26.7V, i2=0.12A, p2=3.1W, unknown1=1, unknown2=0 - 1789: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef c5 00 00 00 05 00 00 00 00 83 1e d7 - 1790: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef c6 00 00 00 05 00 00 00 00 73 0a 30 - 1791: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef c7 00 00 00 05 00 00 00 00 e3 07 ac - 1792: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef c8 00 00 00 05 00 00 00 00 13 46 12 - 1793: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef c9 00 00 00 05 00 00 00 00 83 4b 8e - 1794: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef ca 00 00 00 05 00 00 00 00 73 5f 69 - 1795: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef cb 00 00 00 05 00 00 00 00 e3 52 f5 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0a 00 0a 00 1b 01 0c 00 0b 00 1f 00 00 96 -2022-03-28T17:26:35.534115Z MSG src=74608145, dst=74608145, cmd=1, u1=26.6V, i1=0.1A, p1=2.7W, u2=26.8V, i2=0.11A, p2=3.1W, unknown1=1, unknown2=0 - 1796: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef cc 00 00 00 05 00 00 00 00 d3 74 e4 - 1797: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef cd 00 00 00 05 00 00 00 00 43 79 78 - 1798: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef ce 00 00 00 05 00 00 00 00 b3 6d 9f - 1799: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef cf 00 00 00 05 00 00 00 00 23 60 03 - 1800: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef d0 00 00 00 05 00 00 00 00 13 ec a0 - 1801: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef d1 00 00 00 05 00 00 00 00 83 e1 3c - 1802: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef d2 00 00 00 05 00 00 00 00 73 f5 db - 1803: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef d3 00 00 00 05 00 00 00 00 e3 f8 47 - 1804: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef d4 00 00 00 05 00 00 00 00 d3 de 56 - 1805: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef d5 00 00 00 05 00 00 00 00 43 d3 ca -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0a 00 0a 00 1b 01 0b 00 0b 00 1e 00 00 90 -2022-03-28T17:26:45.573469Z MSG src=74608145, dst=74608145, cmd=1, u1=26.6V, i1=0.1A, p1=2.7W, u2=26.7V, i2=0.11A, p2=3.0W, unknown1=1, unknown2=0 - 1806: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef d6 00 00 00 05 00 00 00 00 b3 c7 2d - 1807: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef d7 00 00 00 05 00 00 00 00 23 ca b1 - 1808: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef d8 00 00 00 05 00 00 00 00 d3 8b 0f - 1809: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef d9 00 00 00 05 00 00 00 00 43 86 93 - 1810: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef da 00 00 00 05 00 00 00 00 b3 92 74 - 1811: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef db 00 00 00 05 00 00 00 00 23 9f e8 - 1812: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef dc 00 00 00 05 00 00 00 00 13 b9 f9 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 09 00 0a 00 1b 01 0a 00 0b 00 1e 00 00 92 -2022-03-28T17:26:52.602958Z MSG src=74608145, dst=74608145, cmd=1, u1=26.5V, i1=0.1A, p1=2.7W, u2=26.6V, i2=0.11A, p2=3.0W, unknown1=1, unknown2=0 - 1813: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef dd 00 00 00 05 00 00 00 00 83 b4 65 - 1814: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef de 00 00 00 05 00 00 00 00 73 a0 82 - 1815: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef df 00 00 00 05 00 00 00 00 e3 ad 1e - 1816: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef e0 00 00 00 05 00 00 00 00 12 b8 c5 - 1817: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef e1 00 00 00 05 00 00 00 00 82 b5 59 - 1818: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef e2 00 00 00 05 00 00 00 00 72 a1 be - 1819: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef e3 00 00 00 05 00 00 00 00 e2 ac 22 - 1820: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef e4 00 00 00 05 00 00 00 00 d2 8a 33 - 1821: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef e5 00 00 00 05 00 00 00 00 42 87 af - 1822: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef e6 00 00 00 05 00 00 00 00 b2 93 48 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 08 00 0a 00 1a 01 0a 00 0b 00 1e 00 00 92 -2022-03-28T17:27:02.642512Z MSG src=74608145, dst=74608145, cmd=1, u1=26.4V, i1=0.1A, p1=2.6W, u2=26.6V, i2=0.11A, p2=3.0W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 32 00 00 37 ba 06 7e 06 82 09 30 13 87 00 35 7e -2022-03-28T17:27:02.691746Z MSG src=74608145, dst=74608145, cmd=2, u=235.2V, f=49.99Hz, p=5.3W, uk1=12850, uk2=0, uk3=14266, uk4=1662, uk5=1666 - 1823: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef e7 00 00 00 05 00 00 00 00 22 9e d4 - 1824: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef e8 00 00 00 05 00 00 00 00 d2 df 6a - 1825: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef e9 00 00 00 05 00 00 00 00 42 d2 f6 - 1826: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef ea 00 00 00 05 00 00 00 00 b2 c6 11 - 1827: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef eb 00 00 00 05 00 00 00 00 22 cb 8d - 1828: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef ec 00 00 00 05 00 00 00 00 12 ed 9c - 1829: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef ed 00 00 00 05 00 00 00 00 82 e0 00 - 1830: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef ee 00 00 00 05 00 00 00 00 72 f4 e7 - 1831: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef ef 00 00 00 05 00 00 00 00 e2 f9 7b - 1832: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef f0 00 00 00 05 00 00 00 00 d2 75 d8 - 1833: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef f1 00 00 00 05 00 00 00 00 42 78 44 - 1834: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef f2 00 00 00 05 00 00 00 00 b2 6c a3 - 1835: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef f3 00 00 00 05 00 00 00 00 22 61 3f - 1836: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef f4 00 00 00 05 00 00 00 00 12 47 2e - 1837: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef f5 00 00 00 05 00 00 00 00 82 4a b2 - 1838: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef f6 00 00 00 05 00 00 00 00 72 5e 55 - 1839: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef f7 00 00 00 05 00 00 00 00 e2 53 c9 - 1840: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef f8 00 00 00 05 00 00 00 00 12 12 77 - 1841: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef f9 00 00 00 05 00 00 00 00 82 1f eb - 1842: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef fa 00 00 00 05 00 00 00 00 72 0b 0c - 1843: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef fb 00 00 00 05 00 00 00 00 e2 06 90 - 1844: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef fc 00 00 00 05 00 00 00 00 d2 20 81 - 1845: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef fd 00 00 00 05 00 00 00 00 42 2d 1d - 1846: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef fe 00 00 00 05 00 00 00 00 b2 39 fa - 1847: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 ef ff 00 00 00 05 00 00 00 00 22 34 66 - 1848: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 00 00 00 00 05 00 00 00 00 73 40 a3 - 1849: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 01 00 00 00 05 00 00 00 00 e3 4d 3f - 1850: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 02 00 00 00 05 00 00 00 00 13 59 d8 - 1851: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 03 00 00 00 05 00 00 00 00 83 54 44 - 1852: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 04 00 00 00 05 00 00 00 00 b3 72 55 - 1853: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 05 00 00 00 05 00 00 00 00 23 7f c9 - 1854: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 06 00 00 00 05 00 00 00 00 d3 6b 2e - 1855: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 07 00 00 00 05 00 00 00 00 43 66 b2 - 1856: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 08 00 00 00 05 00 00 00 00 b3 27 0c - 1857: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 09 00 00 00 05 00 00 00 00 23 2a 90 - 1858: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 0a 00 00 00 05 00 00 00 00 d3 3e 77 - 1859: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 0b 00 00 00 05 00 00 00 00 43 33 eb - 1860: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 0c 00 00 00 05 00 00 00 00 73 15 fa - 1861: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 0d 00 00 00 05 00 00 00 00 e3 18 66 - 1862: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 0e 00 00 00 05 00 00 00 00 13 0c 81 - 1863: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 0f 00 00 00 05 00 00 00 00 83 01 1d - 1864: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 10 00 00 00 05 00 00 00 00 b3 8d be - 1865: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 11 00 00 00 05 00 00 00 00 23 80 22 - 1866: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 12 00 00 00 05 00 00 00 00 d3 94 c5 - 1867: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 13 00 00 00 05 00 00 00 00 43 99 59 - 1868: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 14 00 00 00 05 00 00 00 00 73 bf 48 - 1869: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 15 00 00 00 05 00 00 00 00 e3 b2 d4 - 1870: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 16 00 00 00 05 00 00 00 00 13 a6 33 - 1871: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 17 00 00 00 05 00 00 00 00 83 ab af - 1872: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 18 00 00 00 05 00 00 00 00 73 ea 11 - 1873: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 19 00 00 00 05 00 00 00 00 e3 e7 8d -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 08 00 09 00 19 01 07 00 0a 00 1b 00 00 9b -2022-03-28T17:27:53.842268Z MSG src=74608145, dst=74608145, cmd=1, u1=26.4V, i1=0.09A, p1=2.5W, u2=26.3V, i2=0.1A, p2=2.7W, unknown1=1, unknown2=0 - 1874: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 1a 00 00 00 05 00 00 00 00 13 f3 6a - 1875: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 1b 00 00 00 05 00 00 00 00 83 fe f6 - 1876: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 1c 00 00 00 05 00 00 00 00 b3 d8 e7 - 1877: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 1d 00 00 00 05 00 00 00 00 23 d5 7b - 1878: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 1e 00 00 00 05 00 00 00 00 d3 c1 9c - 1879: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 1f 00 00 00 05 00 00 00 00 43 cc 00 - 1880: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 20 00 00 00 05 00 00 00 00 b2 d9 db -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 08 00 09 00 18 01 08 00 0a 00 1b 00 00 95 -2022-03-28T17:28:00.871454Z MSG src=74608145, dst=74608145, cmd=1, u1=26.4V, i1=0.09A, p1=2.4W, u2=26.4V, i2=0.1A, p2=2.7W, unknown1=1, unknown2=0 - 1881: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 21 00 00 00 05 00 00 00 00 22 d4 47 - 1882: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 22 00 00 00 05 00 00 00 00 d2 c0 a0 - 1883: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 23 00 00 00 05 00 00 00 00 42 cd 3c - 1884: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 24 00 00 00 05 00 00 00 00 72 eb 2d - 1885: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 25 00 00 00 05 00 00 00 00 e2 e6 b1 - 1886: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 26 00 00 00 05 00 00 00 00 12 f2 56 - 1887: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 27 00 00 00 05 00 00 00 00 82 ff ca - 1888: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 28 00 00 00 05 00 00 00 00 72 be 74 - 1889: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 29 00 00 00 05 00 00 00 00 e2 b3 e8 - 1890: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 2a 00 00 00 05 00 00 00 00 12 a7 0f - 1891: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 2b 00 00 00 05 00 00 00 00 82 aa 93 - 1892: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 2c 00 00 00 05 00 00 00 00 b2 8c 82 - 1893: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 2d 00 00 00 05 00 00 00 00 22 81 1e - 1894: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 2e 00 00 00 05 00 00 00 00 d2 95 f9 - 1895: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 2f 00 00 00 05 00 00 00 00 42 98 65 - 1896: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 30 00 00 00 05 00 00 00 00 72 14 c6 - 1897: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 31 00 00 00 05 00 00 00 00 e2 19 5a -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 07 00 09 00 18 01 07 00 0a 00 1b 00 00 95 -2022-03-28T17:28:17.939524Z MSG src=74608145, dst=74608145, cmd=1, u1=26.3V, i1=0.09A, p1=2.4W, u2=26.3V, i2=0.1A, p2=2.7W, unknown1=1, unknown2=0 - 1898: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 32 00 00 00 05 00 00 00 00 12 0d bd - 1899: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 33 00 00 00 05 00 00 00 00 82 00 21 - 1900: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 34 00 00 00 05 00 00 00 00 b2 26 30 - 1901: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 35 00 00 00 05 00 00 00 00 22 2b ac - 1902: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 36 00 00 00 05 00 00 00 00 d2 3f 4b - 1903: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 37 00 00 00 05 00 00 00 00 42 32 d7 - 1904: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 38 00 00 00 05 00 00 00 00 b2 73 69 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 08 00 09 00 18 01 09 00 0a 00 1b 00 00 94 -2022-03-28T17:28:24.968652Z MSG src=74608145, dst=74608145, cmd=1, u1=26.4V, i1=0.09A, p1=2.4W, u2=26.5V, i2=0.1A, p2=2.7W, unknown1=1, unknown2=0 - 1905: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 39 00 00 00 05 00 00 00 00 22 7e f5 - 1906: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 3a 00 00 00 05 00 00 00 00 d2 6a 12 - 1907: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 3b 00 00 00 05 00 00 00 00 42 67 8e -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 08 00 09 00 18 01 08 00 0a 00 1a 00 00 94 -2022-03-28T17:28:27.978665Z MSG src=74608145, dst=74608145, cmd=1, u1=26.4V, i1=0.09A, p1=2.4W, u2=26.4V, i2=0.1A, p2=2.6W, unknown1=1, unknown2=0 - 1908: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 3c 00 00 00 05 00 00 00 00 72 41 9f - 1909: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 3d 00 00 00 05 00 00 00 00 e2 4c 03 - 1910: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 3e 00 00 00 05 00 00 00 00 12 58 e4 - 1911: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 3f 00 00 00 05 00 00 00 00 82 55 78 - 1912: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 40 00 00 00 05 00 00 00 00 b0 71 11 - 1913: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 41 00 00 00 05 00 00 00 00 20 7c 8d - 1914: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 42 00 00 00 05 00 00 00 00 d0 68 6a -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 07 00 09 00 17 01 06 00 0a 00 1a 00 00 9a -2022-03-28T17:28:35.007441Z MSG src=74608145, dst=74608145, cmd=1, u1=26.3V, i1=0.09A, p1=2.3W, u2=26.2V, i2=0.1A, p2=2.6W, unknown1=1, unknown2=0 - 1915: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 43 00 00 00 05 00 00 00 00 40 65 f6 - 1916: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 44 00 00 00 05 00 00 00 00 70 43 e7 - 1917: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 46 00 00 00 05 00 00 00 00 10 5a 9c - 1918: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 47 00 00 00 05 00 00 00 00 80 57 00 - 1919: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 48 00 00 00 05 00 00 00 00 70 16 be - 1920: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 49 00 00 00 05 00 00 00 00 e0 1b 22 - 1921: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 4a 00 00 00 05 00 00 00 00 10 0f c5 - 1922: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 4b 00 00 00 05 00 00 00 00 80 02 59 - 1923: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 4c 00 00 00 05 00 00 00 00 b0 24 48 - 1924: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 4d 00 00 00 05 00 00 00 00 20 29 d4 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 09 00 09 00 17 01 06 00 0a 00 1a 00 00 94 -2022-03-28T17:28:45.046231Z MSG src=74608145, dst=74608145, cmd=1, u1=26.5V, i1=0.09A, p1=2.3W, u2=26.2V, i2=0.1A, p2=2.6W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 2f 13 85 00 2f 79 -2022-03-28T17:28:45.095775Z MSG src=74608145, dst=74608145, cmd=2, u=235.1V, f=49.97Hz, p=4.7W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 1925: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 4e 00 00 00 05 00 00 00 00 d0 3d 33 - 1926: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 4f 00 00 00 05 00 00 00 00 40 30 af - 1927: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 50 00 00 00 05 00 00 00 00 70 bc 0c - 1928: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 51 00 00 00 05 00 00 00 00 e0 b1 90 - 1929: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 52 00 00 00 05 00 00 00 00 10 a5 77 - 1930: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 53 00 00 00 05 00 00 00 00 80 a8 eb - 1931: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 54 00 00 00 05 00 00 00 00 b0 8e fa -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 08 00 09 00 17 01 07 00 0a 00 1a 00 00 94 -2022-03-28T17:28:52.075339Z MSG src=74608145, dst=74608145, cmd=1, u1=26.4V, i1=0.09A, p1=2.3W, u2=26.3V, i2=0.1A, p2=2.6W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 2f 13 86 00 2e 7b -2022-03-28T17:28:52.124870Z MSG src=74608145, dst=74608145, cmd=2, u=235.1V, f=49.98Hz, p=4.6W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 1932: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 55 00 00 00 05 00 00 00 00 20 83 66 - 1933: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 56 00 00 00 05 00 00 00 00 d0 97 81 - 1934: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 57 00 00 00 05 00 00 00 00 40 9a 1d - 1935: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 58 00 00 00 05 00 00 00 00 b0 db a3 - 1936: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 59 00 00 00 05 00 00 00 00 20 d6 3f - 1937: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 5a 00 00 00 05 00 00 00 00 d0 c2 d8 - 1938: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 5b 00 00 00 05 00 00 00 00 40 cf 44 - 1939: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 5c 00 00 00 05 00 00 00 00 70 e9 55 - 1940: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 5d 00 00 00 05 00 00 00 00 e0 e4 c9 - 1941: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 5e 00 00 00 05 00 00 00 00 10 f0 2e -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 08 00 09 00 17 01 06 00 0a 00 19 00 00 96 -2022-03-28T17:29:02.114132Z MSG src=74608145, dst=74608145, cmd=1, u1=26.4V, i1=0.09A, p1=2.3W, u2=26.2V, i2=0.1A, p2=2.5W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 2e 13 85 00 2e 79 -2022-03-28T17:29:02.163626Z MSG src=74608145, dst=74608145, cmd=2, u=235.0V, f=49.97Hz, p=4.6W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 1942: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 5f 00 00 00 05 00 00 00 00 80 fd b2 - 1943: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 60 00 00 00 05 00 00 00 00 71 e8 69 - 1944: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 61 00 00 00 05 00 00 00 00 e1 e5 f5 - 1945: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 62 00 00 00 05 00 00 00 00 11 f1 12 - 1946: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 63 00 00 00 05 00 00 00 00 81 fc 8e - 1947: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 64 00 00 00 05 00 00 00 00 b1 da 9f - 1948: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 65 00 00 00 05 00 00 00 00 21 d7 03 - 1949: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 66 00 00 00 05 00 00 00 00 d1 c3 e4 - 1950: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 67 00 00 00 05 00 00 00 00 41 ce 78 - 1951: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 68 00 00 00 05 00 00 00 00 b1 8f c6 - 1952: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 69 00 00 00 05 00 00 00 00 21 82 5a - 1953: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 6a 00 00 00 05 00 00 00 00 d1 96 bd - 1954: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 6b 00 00 00 05 00 00 00 00 41 9b 21 - 1955: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 6c 00 00 00 05 00 00 00 00 71 bd 30 - 1956: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 6d 00 00 00 05 00 00 00 00 e1 b0 ac - 1957: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 6e 00 00 00 05 00 00 00 00 11 a4 4b - 1958: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 6f 00 00 00 05 00 00 00 00 81 a9 d7 - 1959: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 70 00 00 00 05 00 00 00 00 b1 25 74 - 1960: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 71 00 00 00 05 00 00 00 00 21 28 e8 - 1961: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 72 00 00 00 05 00 00 00 00 d1 3c 0f - 1962: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 73 00 00 00 05 00 00 00 00 41 31 93 - 1963: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 74 00 00 00 05 00 00 00 00 71 17 82 - 1964: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 75 00 00 00 05 00 00 00 00 e1 1a 1e - 1965: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 76 00 00 00 05 00 00 00 00 11 0e f9 - 1966: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 77 00 00 00 05 00 00 00 00 81 03 65 - 1967: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 78 00 00 00 05 00 00 00 00 71 42 db - 1968: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 79 00 00 00 05 00 00 00 00 e1 4f 47 - 1969: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 7a 00 00 00 05 00 00 00 00 11 5b a0 - 1970: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 7b 00 00 00 05 00 00 00 00 81 56 3c - 1971: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 7c 00 00 00 05 00 00 00 00 b1 70 2d - 1972: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 7d 00 00 00 05 00 00 00 00 21 7d b1 - 1973: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 7e 00 00 00 05 00 00 00 00 d1 69 56 - 1974: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 7f 00 00 00 05 00 00 00 00 41 64 ca - 1975: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 80 00 00 00 05 00 00 00 00 b5 21 84 - 1976: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 81 00 00 00 05 00 00 00 00 25 2c 18 - 1977: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 82 00 00 00 05 00 00 00 00 d5 38 ff - 1978: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 83 00 00 00 05 00 00 00 00 45 35 63 - 1979: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 84 00 00 00 05 00 00 00 00 75 13 72 - 1980: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 85 00 00 00 05 00 00 00 00 e5 1e ee - 1981: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 86 00 00 00 05 00 00 00 00 15 0a 09 - 1982: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 87 00 00 00 05 00 00 00 00 85 07 95 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 06 00 08 00 16 01 07 00 09 00 18 00 00 9b -2022-03-28T17:29:43.273447Z MSG src=74608145, dst=74608145, cmd=1, u1=26.2V, i1=0.08A, p1=2.2W, u2=26.3V, i2=0.09A, p2=2.4W, unknown1=1, unknown2=0 - 1983: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 88 00 00 00 05 00 00 00 00 75 46 2b - 1984: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 89 00 00 00 05 00 00 00 00 e5 4b b7 - 1985: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 8a 00 00 00 05 00 00 00 00 15 5f 50 - 1986: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 8b 00 00 00 05 00 00 00 00 85 52 cc - 1987: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 8c 00 00 00 05 00 00 00 00 b5 74 dd - 1988: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 8d 00 00 00 05 00 00 00 00 25 79 41 - 1989: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 8e 00 00 00 05 00 00 00 00 d5 6d a6 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 06 00 08 00 15 01 05 00 09 00 18 00 00 9a -2022-03-28T17:29:50.302421Z MSG src=74608145, dst=74608145, cmd=1, u1=26.2V, i1=0.08A, p1=2.1W, u2=26.1V, i2=0.09A, p2=2.4W, unknown1=1, unknown2=0 - 1990: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 8f 00 00 00 05 00 00 00 00 45 60 3a - 1991: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 90 00 00 00 05 00 00 00 00 75 ec 99 - 1992: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 91 00 00 00 05 00 00 00 00 e5 e1 05 - 1993: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 92 00 00 00 05 00 00 00 00 15 f5 e2 - 1994: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 93 00 00 00 05 00 00 00 00 85 f8 7e - 1995: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 94 00 00 00 05 00 00 00 00 b5 de 6f - 1996: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 95 00 00 00 05 00 00 00 00 25 d3 f3 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 05 00 08 00 15 01 05 00 09 00 18 00 00 99 -2022-03-28T17:29:57.331469Z MSG src=74608145, dst=74608145, cmd=1, u1=26.1V, i1=0.08A, p1=2.1W, u2=26.1V, i2=0.09A, p2=2.4W, unknown1=1, unknown2=0 - 1997: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 96 00 00 00 05 00 00 00 00 d5 c7 14 - 1998: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 97 00 00 00 05 00 00 00 00 45 ca 88 - 1999: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 98 00 00 00 05 00 00 00 00 b5 8b 36 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 06 00 08 00 15 01 06 00 09 00 18 00 00 99 -2022-03-28T17:30:00.341162Z MSG src=74608145, dst=74608145, cmd=1, u1=26.2V, i1=0.08A, p1=2.1W, u2=26.2V, i2=0.09A, p2=2.4W, unknown1=1, unknown2=0 - 2000: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 99 00 00 00 05 00 00 00 00 25 86 aa - 2001: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 9a 00 00 00 05 00 00 00 00 d5 92 4d - 2002: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 9b 00 00 00 05 00 00 00 00 45 9f d1 - 2003: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 9c 00 00 00 05 00 00 00 00 75 b9 c0 - 2004: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 9d 00 00 00 05 00 00 00 00 e5 b4 5c - 2005: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 9e 00 00 00 05 00 00 00 00 15 a0 bb - 2006: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 9f 00 00 00 05 00 00 00 00 85 ad 27 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 06 00 08 00 15 01 06 00 09 00 17 00 00 96 -2022-03-28T17:30:07.370026Z MSG src=74608145, dst=74608145, cmd=1, u1=26.2V, i1=0.08A, p1=2.1W, u2=26.2V, i2=0.09A, p2=2.3W, unknown1=1, unknown2=0 - 2007: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 a0 00 00 00 05 00 00 00 00 74 b8 fc - 2008: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 a1 00 00 00 05 00 00 00 00 e4 b5 60 - 2009: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 a2 00 00 00 05 00 00 00 00 14 a1 87 - 2010: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 a3 00 00 00 05 00 00 00 00 84 ac 1b - 2011: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 a4 00 00 00 05 00 00 00 00 b4 8a 0a - 2012: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 a5 00 00 00 05 00 00 00 00 24 87 96 - 2013: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 a6 00 00 00 05 00 00 00 00 d4 93 71 - 2014: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 a7 00 00 00 05 00 00 00 00 44 9e ed - 2015: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 a8 00 00 00 05 00 00 00 00 b4 df 53 - 2016: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 a9 00 00 00 05 00 00 00 00 24 d2 cf - 2017: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 aa 00 00 00 05 00 00 00 00 d4 c6 28 - 2018: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 ab 00 00 00 05 00 00 00 00 44 cb b4 - 2019: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 ac 00 00 00 05 00 00 00 00 74 ed a5 - 2020: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 ad 00 00 00 05 00 00 00 00 e4 e0 39 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 05 00 08 00 15 01 06 00 09 00 17 00 00 95 -2022-03-28T17:30:21.427986Z MSG src=74608145, dst=74608145, cmd=1, u1=26.1V, i1=0.08A, p1=2.1W, u2=26.2V, i2=0.09A, p2=2.3W, unknown1=1, unknown2=0 - 2021: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 ae 00 00 00 05 00 00 00 00 14 f4 de - 2022: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 af 00 00 00 05 00 00 00 00 84 f9 42 - 2023: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 b0 00 00 00 05 00 00 00 00 b4 75 e1 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 06 00 08 00 14 01 06 00 09 00 17 00 00 97 -2022-03-28T17:30:24.437512Z MSG src=74608145, dst=74608145, cmd=1, u1=26.2V, i1=0.08A, p1=2.0W, u2=26.2V, i2=0.09A, p2=2.3W, unknown1=1, unknown2=0 - 2024: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 b1 00 00 00 05 00 00 00 00 24 78 7d - 2025: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 b2 00 00 00 05 00 00 00 00 d4 6c 9a - 2026: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 b3 00 00 00 05 00 00 00 00 44 61 06 - 2027: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 b4 00 00 00 05 00 00 00 00 74 47 17 - 2028: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 b5 00 00 00 05 00 00 00 00 e4 4a 8b - 2029: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 b6 00 00 00 05 00 00 00 00 14 5e 6c - 2030: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 b7 00 00 00 05 00 00 00 00 84 53 f0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 04 00 08 00 14 01 04 00 09 00 17 00 00 97 -2022-03-28T17:30:31.466500Z MSG src=74608145, dst=74608145, cmd=1, u1=26.0V, i1=0.08A, p1=2.0W, u2=26.0V, i2=0.09A, p2=2.3W, unknown1=1, unknown2=0 - 2031: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 b8 00 00 00 05 00 00 00 00 74 12 4e - 2032: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 b9 00 00 00 05 00 00 00 00 e4 1f d2 - 2033: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 ba 00 00 00 05 00 00 00 00 14 0b 35 - 2034: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 bb 00 00 00 05 00 00 00 00 84 06 a9 - 2035: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 bc 00 00 00 05 00 00 00 00 b4 20 b8 - 2036: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 bd 00 00 00 05 00 00 00 00 24 2d 24 - 2037: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 be 00 00 00 05 00 00 00 00 d4 39 c3 - 2038: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 bf 00 00 00 05 00 00 00 00 44 34 5f - 2039: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 c0 00 00 00 05 00 00 00 00 76 10 36 - 2040: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 c1 00 00 00 05 00 00 00 00 e6 1d aa - 2041: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 c2 00 00 00 05 00 00 00 00 16 09 4d - 2042: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 c3 00 00 00 05 00 00 00 00 86 04 d1 - 2043: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 c4 00 00 00 05 00 00 00 00 b6 22 c0 - 2044: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 c5 00 00 00 05 00 00 00 00 26 2f 5c - 2045: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 c6 00 00 00 05 00 00 00 00 d6 3b bb - 2046: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 c7 00 00 00 05 00 00 00 00 46 36 27 - 2047: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 c8 00 00 00 05 00 00 00 00 b6 77 99 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 03 00 08 00 14 01 05 00 09 00 16 00 00 90 -2022-03-28T17:30:48.533951Z MSG src=74608145, dst=74608145, cmd=1, u1=25.9V, i1=0.08A, p1=2.0W, u2=26.1V, i2=0.09A, p2=2.2W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 2f 13 87 00 28 7c -2022-03-28T17:30:48.583520Z MSG src=74608145, dst=74608145, cmd=2, u=235.1V, f=49.99Hz, p=4.0W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 2048: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 c9 00 00 00 05 00 00 00 00 26 7a 05 - 2049: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 ca 00 00 00 05 00 00 00 00 d6 6e e2 - 2050: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 cb 00 00 00 05 00 00 00 00 46 63 7e - 2051: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 cc 00 00 00 05 00 00 00 00 76 45 6f - 2052: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 cd 00 00 00 05 00 00 00 00 e6 48 f3 - 2053: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 ce 00 00 00 05 00 00 00 00 16 5c 14 - 2054: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 cf 00 00 00 05 00 00 00 00 86 51 88 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 05 00 08 00 14 01 06 00 09 00 16 00 00 95 -2022-03-28T17:30:55.563180Z MSG src=74608145, dst=74608145, cmd=1, u1=26.1V, i1=0.08A, p1=2.0W, u2=26.2V, i2=0.09A, p2=2.2W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 2e 13 86 00 28 7c -2022-03-28T17:30:55.612469Z MSG src=74608145, dst=74608145, cmd=2, u=235.0V, f=49.98Hz, p=4.0W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 2055: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 d0 00 00 00 05 00 00 00 00 b6 dd 2b - 2056: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 d1 00 00 00 05 00 00 00 00 26 d0 b7 - 2057: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 d2 00 00 00 05 00 00 00 00 d6 c4 50 - 2058: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 d3 00 00 00 05 00 00 00 00 46 c9 cc - 2059: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 d4 00 00 00 05 00 00 00 00 76 ef dd - 2060: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 d5 00 00 00 05 00 00 00 00 e6 e2 41 - 2061: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 d6 00 00 00 05 00 00 00 00 16 f6 a6 - 2062: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 d7 00 00 00 05 00 00 00 00 86 fb 3a - 2063: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 d8 00 00 00 05 00 00 00 00 76 ba 84 - 2064: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 d9 00 00 00 05 00 00 00 00 e6 b7 18 - 2065: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 da 00 00 00 05 00 00 00 00 16 a3 ff - 2066: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 db 00 00 00 05 00 00 00 00 86 ae 63 - 2067: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 dc 00 00 00 05 00 00 00 00 b6 88 72 - 2068: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 dd 00 00 00 05 00 00 00 00 26 85 ee - 2069: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 de 00 00 00 05 00 00 00 00 d6 91 09 - 2070: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 df 00 00 00 05 00 00 00 00 46 9c 95 - 2071: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 e0 00 00 00 05 00 00 00 00 b7 89 4e -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 03 00 07 00 13 01 04 00 08 00 16 00 00 98 -2022-03-28T17:31:12.630313Z MSG src=74608145, dst=74608145, cmd=1, u1=25.9V, i1=0.07A, p1=1.9W, u2=26.0V, i2=0.08A, p2=2.2W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 2d 13 86 00 27 70 -2022-03-28T17:31:12.679895Z MSG src=74608145, dst=74608145, cmd=2, u=234.9V, f=49.98Hz, p=3.9W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 2072: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 e1 00 00 00 05 00 00 00 00 27 84 d2 - 2073: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 e2 00 00 00 05 00 00 00 00 d7 90 35 - 2074: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 e3 00 00 00 05 00 00 00 00 47 9d a9 - 2075: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 e4 00 00 00 05 00 00 00 00 77 bb b8 - 2076: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 e5 00 00 00 05 00 00 00 00 e7 b6 24 - 2077: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 e6 00 00 00 05 00 00 00 00 17 a2 c3 - 2078: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 e7 00 00 00 05 00 00 00 00 87 af 5f - 2079: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 e8 00 00 00 05 00 00 00 00 77 ee e1 - 2080: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 e9 00 00 00 05 00 00 00 00 e7 e3 7d - 2081: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 ea 00 00 00 05 00 00 00 00 17 f7 9a - 2082: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 eb 00 00 00 05 00 00 00 00 87 fa 06 - 2083: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 ec 00 00 00 05 00 00 00 00 b7 dc 17 - 2084: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 ed 00 00 00 05 00 00 00 00 27 d1 8b - 2085: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 ee 00 00 00 05 00 00 00 00 d7 c5 6c - 2086: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 ef 00 00 00 05 00 00 00 00 47 c8 f0 - 2087: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 f0 00 00 00 05 00 00 00 00 77 44 53 - 2088: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 f1 00 00 00 05 00 00 00 00 e7 49 cf -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 03 00 07 00 13 01 04 00 08 00 15 00 00 9b -2022-03-28T17:31:29.697709Z MSG src=74608145, dst=74608145, cmd=1, u1=25.9V, i1=0.07A, p1=1.9W, u2=26.0V, i2=0.08A, p2=2.1W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 2c 13 85 00 26 73 -2022-03-28T17:31:29.747337Z MSG src=74608145, dst=74608145, cmd=2, u=234.8V, f=49.97Hz, p=3.8W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 2089: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 f2 00 00 00 05 00 00 00 00 17 5d 28 - 2090: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 f3 00 00 00 05 00 00 00 00 87 50 b4 - 2091: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 f4 00 00 00 05 00 00 00 00 b7 76 a5 - 2092: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 f5 00 00 00 05 00 00 00 00 27 7b 39 - 2093: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 f6 00 00 00 05 00 00 00 00 d7 6f de - 2094: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 f7 00 00 00 05 00 00 00 00 47 62 42 - 2095: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 f8 00 00 00 05 00 00 00 00 b7 23 fc - 2096: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 f9 00 00 00 05 00 00 00 00 27 2e 60 - 2097: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 fa 00 00 00 05 00 00 00 00 d7 3a 87 - 2098: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 fb 00 00 00 05 00 00 00 00 47 37 1b - 2099: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 fc 00 00 00 05 00 00 00 00 77 11 0a - 2100: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 fd 00 00 00 05 00 00 00 00 e7 1c 96 - 2101: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 fe 00 00 00 05 00 00 00 00 17 08 71 - 2102: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f0 ff 00 00 00 05 00 00 00 00 87 05 ed - 2103: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 00 00 00 00 05 00 00 00 00 b6 11 36 - 2104: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 01 00 00 00 05 00 00 00 00 26 1c aa - 2105: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 02 00 00 00 05 00 00 00 00 d6 08 4d - 2106: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 03 00 00 00 05 00 00 00 00 46 05 d1 - 2107: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 04 00 00 00 05 00 00 00 00 76 23 c0 - 2108: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 05 00 00 00 05 00 00 00 00 e6 2e 5c - 2109: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 06 00 00 00 05 00 00 00 00 16 3a bb - 2110: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 07 00 00 00 05 00 00 00 00 86 37 27 - 2111: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 08 00 00 00 05 00 00 00 00 76 76 99 - 2112: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 09 00 00 00 05 00 00 00 00 e6 7b 05 - 2113: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 0a 00 00 00 05 00 00 00 00 16 6f e2 - 2114: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 0b 00 00 00 05 00 00 00 00 86 62 7e - 2115: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 0c 00 00 00 05 00 00 00 00 b6 44 6f - 2116: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 0d 00 00 00 05 00 00 00 00 26 49 f3 - 2117: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 0e 00 00 00 05 00 00 00 00 d6 5d 14 - 2118: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 0f 00 00 00 05 00 00 00 00 46 50 88 - 2119: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 10 00 00 00 05 00 00 00 00 76 dc 2b - 2120: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 11 00 00 00 05 00 00 00 00 e6 d1 b7 - 2121: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 12 00 00 00 05 00 00 00 00 16 c5 50 - 2122: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 13 00 00 00 05 00 00 00 00 86 c8 cc - 2123: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 14 00 00 00 05 00 00 00 00 b6 ee dd - 2124: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 15 00 00 00 05 00 00 00 00 26 e3 41 - 2125: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 16 00 00 00 05 00 00 00 00 d6 f7 a6 - 2126: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 17 00 00 00 05 00 00 00 00 46 fa 3a - 2127: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 18 00 00 00 05 00 00 00 00 b6 bb 84 - 2128: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 19 00 00 00 05 00 00 00 00 26 b6 18 - 2129: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 1a 00 00 00 05 00 00 00 00 d6 a2 ff -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 03 00 07 00 12 01 04 00 08 00 14 00 00 9b -2022-03-28T17:32:10.856415Z MSG src=74608145, dst=74608145, cmd=1, u1=25.9V, i1=0.07A, p1=1.8W, u2=26.0V, i2=0.08A, p2=2.0W, unknown1=1, unknown2=0 - 2130: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 1b 00 00 00 05 00 00 00 00 46 af 63 - 2131: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 1c 00 00 00 05 00 00 00 00 76 89 72 - 2132: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 1d 00 00 00 05 00 00 00 00 e6 84 ee - 2133: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 1e 00 00 00 05 00 00 00 00 16 90 09 - 2134: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 1f 00 00 00 05 00 00 00 00 86 9d 95 - 2135: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 20 00 00 00 05 00 00 00 00 77 88 4e - 2136: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 21 00 00 00 05 00 00 00 00 e7 85 d2 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 02 00 07 00 12 01 03 00 08 00 14 00 00 9d -2022-03-28T17:32:17.885250Z MSG src=74608145, dst=74608145, cmd=1, u1=25.8V, i1=0.07A, p1=1.8W, u2=25.9V, i2=0.08A, p2=2.0W, unknown1=1, unknown2=0 - 2137: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 22 00 00 00 05 00 00 00 00 17 91 35 - 2138: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 23 00 00 00 05 00 00 00 00 87 9c a9 - 2139: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 24 00 00 00 05 00 00 00 00 b7 ba b8 - 2140: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 25 00 00 00 05 00 00 00 00 27 b7 24 - 2141: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 26 00 00 00 05 00 00 00 00 d7 a3 c3 - 2142: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 27 00 00 00 05 00 00 00 00 47 ae 5f - 2143: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 28 00 00 00 05 00 00 00 00 b7 ef e1 - 2144: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 29 00 00 00 05 00 00 00 00 27 e2 7d - 2145: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 2a 00 00 00 05 00 00 00 00 d7 f6 9a - 2146: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 2b 00 00 00 05 00 00 00 00 47 fb 06 - 2147: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 2c 00 00 00 05 00 00 00 00 77 dd 17 - 2148: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 2d 00 00 00 05 00 00 00 00 e7 d0 8b - 2149: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 2e 00 00 00 05 00 00 00 00 17 c4 6c - 2150: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 2f 00 00 00 05 00 00 00 00 87 c9 f0 - 2151: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 30 00 00 00 05 00 00 00 00 b7 45 53 - 2152: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 31 00 00 00 05 00 00 00 00 27 48 cf - 2153: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 32 00 00 00 05 00 00 00 00 d7 5c 28 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 03 00 07 00 11 01 01 00 08 00 14 00 00 9d -2022-03-28T17:32:34.952682Z MSG src=74608145, dst=74608145, cmd=1, u1=25.9V, i1=0.07A, p1=1.7W, u2=25.7V, i2=0.08A, p2=2.0W, unknown1=1, unknown2=0 - 2154: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 33 00 00 00 05 00 00 00 00 47 51 b4 - 2155: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 34 00 00 00 05 00 00 00 00 77 77 a5 - 2156: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 35 00 00 00 05 00 00 00 00 e7 7a 39 - 2157: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 36 00 00 00 05 00 00 00 00 17 6e de - 2158: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 37 00 00 00 05 00 00 00 00 87 63 42 - 2159: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 38 00 00 00 05 00 00 00 00 77 22 fc - 2160: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 39 00 00 00 05 00 00 00 00 e7 2f 60 - 2161: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 3a 00 00 00 05 00 00 00 00 17 3b 87 - 2162: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 3b 00 00 00 05 00 00 00 00 87 36 1b - 2163: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 3c 00 00 00 05 00 00 00 00 b7 10 0a - 2164: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 3d 00 00 00 05 00 00 00 00 27 1d 96 - 2165: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 3e 00 00 00 05 00 00 00 00 d7 09 71 - 2166: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 3f 00 00 00 05 00 00 00 00 47 04 ed - 2167: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 40 00 00 00 05 00 00 00 00 75 20 84 - 2168: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 41 00 00 00 05 00 00 00 00 e5 2d 18 - 2169: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 42 00 00 00 05 00 00 00 00 15 39 ff - 2170: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 44 00 00 00 05 00 00 00 00 b5 12 72 - 2171: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 45 00 00 00 05 00 00 00 00 25 1f ee - 2172: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 46 00 00 00 05 00 00 00 00 d5 0b 09 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 02 00 07 00 11 01 02 00 07 00 13 00 00 97 -2022-03-28T17:32:54.029711Z MSG src=74608145, dst=74608145, cmd=1, u1=25.8V, i1=0.07A, p1=1.7W, u2=25.8V, i2=0.07A, p2=1.9W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 30 13 85 00 23 6a -2022-03-28T17:32:54.079358Z MSG src=74608145, dst=74608145, cmd=2, u=235.2V, f=49.97Hz, p=3.5W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 -Received 23 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 83 00 00 00 01 03 e9 01 01 00 06 fb 71 71 -2022-03-28T17:32:54.128653Z MSG src=74608145, dst=74608145, cmd=131, unknown cmd 131 - 2173: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 47 00 00 00 05 00 00 00 00 45 06 95 - 2174: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 48 00 00 00 05 00 00 00 00 b5 47 2b - 2175: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 49 00 00 00 05 00 00 00 00 25 4a b7 - 2176: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 4a 00 00 00 05 00 00 00 00 d5 5e 50 - 2177: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 4b 00 00 00 05 00 00 00 00 45 53 cc - 2178: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 4c 00 00 00 05 00 00 00 00 75 75 dd - 2179: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 4d 00 00 00 05 00 00 00 00 e5 78 41 - 2180: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 4e 00 00 00 05 00 00 00 00 15 6c a6 - 2181: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 4f 00 00 00 05 00 00 00 00 85 61 3a - 2182: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 50 00 00 00 05 00 00 00 00 b5 ed 99 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 01 00 07 00 11 01 01 00 07 00 13 00 00 97 -2022-03-28T17:33:04.068041Z MSG src=74608145, dst=74608145, cmd=1, u1=25.7V, i1=0.07A, p1=1.7W, u2=25.7V, i2=0.07A, p2=1.9W, unknown1=1, unknown2=0 - 2183: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 51 00 00 00 05 00 00 00 00 25 e0 05 - 2184: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 52 00 00 00 05 00 00 00 00 d5 f4 e2 - 2185: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 53 00 00 00 05 00 00 00 00 45 f9 7e -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 03 00 07 00 11 01 01 00 07 00 13 00 00 95 -2022-03-28T17:33:07.078958Z MSG src=74608145, dst=74608145, cmd=1, u1=25.9V, i1=0.07A, p1=1.7W, u2=25.7V, i2=0.07A, p2=1.9W, unknown1=1, unknown2=0 - 2186: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 54 00 00 00 05 00 00 00 00 75 df 6f - 2187: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 55 00 00 00 05 00 00 00 00 e5 d2 f3 - 2188: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 56 00 00 00 05 00 00 00 00 15 c6 14 - 2189: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 57 00 00 00 05 00 00 00 00 85 cb 88 - 2190: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 58 00 00 00 05 00 00 00 00 75 8a 36 - 2191: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 59 00 00 00 05 00 00 00 00 e5 87 aa - 2192: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 5a 00 00 00 05 00 00 00 00 15 93 4d - 2193: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 5b 00 00 00 05 00 00 00 00 85 9e d1 - 2194: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 5c 00 00 00 05 00 00 00 00 b5 b8 c0 - 2195: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 5d 00 00 00 05 00 00 00 00 25 b5 5c - 2196: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 5e 00 00 00 05 00 00 00 00 d5 a1 bb - 2197: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 5f 00 00 00 05 00 00 00 00 45 ac 27 - 2198: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 60 00 00 00 05 00 00 00 00 b4 b9 fc -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 02 00 06 00 10 01 01 00 07 00 13 00 00 94 -2022-03-28T17:33:20.132542Z MSG src=74608145, dst=74608145, cmd=1, u1=25.8V, i1=0.06A, p1=1.6W, u2=25.7V, i2=0.07A, p2=1.9W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 30 13 85 00 22 6b -2022-03-28T17:33:20.182119Z MSG src=74608145, dst=74608145, cmd=2, u=235.2V, f=49.97Hz, p=3.4W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 2199: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 61 00 00 00 05 00 00 00 00 24 b4 60 - 2200: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 62 00 00 00 05 00 00 00 00 d4 a0 87 - 2201: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 63 00 00 00 05 00 00 00 00 44 ad 1b - 2202: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 64 00 00 00 05 00 00 00 00 74 8b 0a - 2203: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 65 00 00 00 05 00 00 00 00 e4 86 96 - 2204: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 66 00 00 00 05 00 00 00 00 14 92 71 - 2205: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 67 00 00 00 05 00 00 00 00 84 9f ed - 2206: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 68 00 00 00 05 00 00 00 00 74 de 53 - 2207: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 69 00 00 00 05 00 00 00 00 e4 d3 cf - 2208: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 6a 00 00 00 05 00 00 00 00 14 c7 28 - 2209: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 6b 00 00 00 05 00 00 00 00 84 ca b4 - 2210: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 6c 00 00 00 05 00 00 00 00 b4 ec a5 - 2211: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 6d 00 00 00 05 00 00 00 00 24 e1 39 - 2212: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 6e 00 00 00 05 00 00 00 00 d4 f5 de - 2213: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 6f 00 00 00 05 00 00 00 00 44 f8 42 - 2214: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 70 00 00 00 05 00 00 00 00 74 74 e1 - 2215: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 71 00 00 00 05 00 00 00 00 e4 79 7d - 2216: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 72 00 00 00 05 00 00 00 00 14 6d 9a - 2217: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 73 00 00 00 05 00 00 00 00 84 60 06 - 2218: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 74 00 00 00 05 00 00 00 00 b4 46 17 - 2219: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 75 00 00 00 05 00 00 00 00 24 4b 8b - 2220: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 76 00 00 00 05 00 00 00 00 d4 5f 6c - 2221: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 77 00 00 00 05 00 00 00 00 44 52 f0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 01 00 06 00 10 01 00 00 07 00 12 00 00 97 -2022-03-28T17:33:43.222844Z MSG src=74608145, dst=74608145, cmd=1, u1=25.7V, i1=0.06A, p1=1.6W, u2=25.6V, i2=0.07A, p2=1.8W, unknown1=1, unknown2=0 - 2222: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 78 00 00 00 05 00 00 00 00 b4 13 4e - 2223: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 79 00 00 00 05 00 00 00 00 24 1e d2 - 2224: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 7a 00 00 00 05 00 00 00 00 d4 0a 35 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 01 00 06 00 10 01 01 00 07 00 12 00 00 96 -2022-03-28T17:33:46.233453Z MSG src=74608145, dst=74608145, cmd=1, u1=25.7V, i1=0.06A, p1=1.6W, u2=25.7V, i2=0.07A, p2=1.8W, unknown1=1, unknown2=0 - 2225: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 7b 00 00 00 05 00 00 00 00 44 07 a9 - 2226: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 7c 00 00 00 05 00 00 00 00 74 21 b8 - 2227: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 7d 00 00 00 05 00 00 00 00 e4 2c 24 - 2228: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 7e 00 00 00 05 00 00 00 00 14 38 c3 - 2229: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 7f 00 00 00 05 00 00 00 00 84 35 5f - 2230: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 80 00 00 00 05 00 00 00 00 70 70 11 - 2231: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 81 00 00 00 05 00 00 00 00 e0 7d 8d - 2232: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 82 00 00 00 05 00 00 00 00 10 69 6a - 2233: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 83 00 00 00 05 00 00 00 00 80 64 f6 - 2234: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 84 00 00 00 05 00 00 00 00 b0 42 e7 - 2235: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 85 00 00 00 05 00 00 00 00 20 4f 7b - 2236: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 86 00 00 00 05 00 00 00 00 d0 5b 9c - 2237: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 87 00 00 00 05 00 00 00 00 40 56 00 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 02 00 06 00 10 01 00 00 07 00 12 00 00 94 -2022-03-28T17:33:59.285718Z MSG src=74608145, dst=74608145, cmd=1, u1=25.8V, i1=0.06A, p1=1.6W, u2=25.6V, i2=0.07A, p2=1.8W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 2d 13 84 00 20 75 -2022-03-28T17:33:59.335346Z MSG src=74608145, dst=74608145, cmd=2, u=234.9V, f=49.96Hz, p=3.2W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 2238: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 88 00 00 00 05 00 00 00 00 b0 17 be - 2239: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 89 00 00 00 05 00 00 00 00 20 1a 22 - 2240: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 8a 00 00 00 05 00 00 00 00 d0 0e c5 - 2241: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 8b 00 00 00 05 00 00 00 00 40 03 59 - 2242: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 8c 00 00 00 05 00 00 00 00 70 25 48 - 2243: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 8d 00 00 00 05 00 00 00 00 e0 28 d4 - 2244: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 8e 00 00 00 05 00 00 00 00 10 3c 33 - 2245: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 8f 00 00 00 05 00 00 00 00 80 31 af - 2246: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 90 00 00 00 05 00 00 00 00 b0 bd 0c - 2247: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 91 00 00 00 05 00 00 00 00 20 b0 90 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 02 00 06 00 10 01 00 00 07 00 12 00 00 94 -2022-03-28T17:34:09.327314Z MSG src=74608145, dst=74608145, cmd=1, u1=25.8V, i1=0.06A, p1=1.6W, u2=25.6V, i2=0.07A, p2=1.8W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 33 13 84 00 20 6b -2022-03-28T17:34:09.377001Z MSG src=74608145, dst=74608145, cmd=2, u=235.5V, f=49.96Hz, p=3.2W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 2248: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 92 00 00 00 05 00 00 00 00 d0 a4 77 - 2249: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 93 00 00 00 05 00 00 00 00 40 a9 eb - 2250: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 94 00 00 00 05 00 00 00 00 70 8f fa - 2251: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 95 00 00 00 05 00 00 00 00 e0 82 66 - 2252: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 96 00 00 00 05 00 00 00 00 10 96 81 - 2253: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 97 00 00 00 05 00 00 00 00 80 9b 1d - 2254: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 98 00 00 00 05 00 00 00 00 70 da a3 - 2255: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 99 00 00 00 05 00 00 00 00 e0 d7 3f - 2256: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 9a 00 00 00 05 00 00 00 00 10 c3 d8 - 2257: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 9b 00 00 00 05 00 00 00 00 80 ce 44 - 2258: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 9c 00 00 00 05 00 00 00 00 b0 e8 55 - 2259: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 9d 00 00 00 05 00 00 00 00 20 e5 c9 - 2260: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 9e 00 00 00 05 00 00 00 00 d0 f1 2e - 2261: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 9f 00 00 00 05 00 00 00 00 40 fc b2 - 2262: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 a0 00 00 00 05 00 00 00 00 b1 e9 69 - 2263: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 a1 00 00 00 05 00 00 00 00 21 e4 f5 - 2264: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 a2 00 00 00 05 00 00 00 00 d1 f0 12 - 2265: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 a3 00 00 00 05 00 00 00 00 41 fd 8e - 2266: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 a4 00 00 00 05 00 00 00 00 71 db 9f - 2267: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 a5 00 00 00 05 00 00 00 00 e1 d6 03 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 02 00 06 00 0f 01 00 00 07 00 11 00 00 88 -2022-03-28T17:34:29.404817Z MSG src=74608145, dst=74608145, cmd=1, u1=25.8V, i1=0.06A, p1=1.5W, u2=25.6V, i2=0.07A, p2=1.7W, unknown1=1, unknown2=0 - 2268: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 a6 00 00 00 05 00 00 00 00 11 c2 e4 - 2269: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 a7 00 00 00 05 00 00 00 00 81 cf 78 - 2270: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 a8 00 00 00 05 00 00 00 00 71 8e c6 - 2271: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 a9 00 00 00 05 00 00 00 00 e1 83 5a - 2272: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 aa 00 00 00 05 00 00 00 00 11 97 bd - 2273: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 ab 00 00 00 05 00 00 00 00 81 9a 21 - 2274: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 ac 00 00 00 05 00 00 00 00 b1 bc 30 - 2275: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 ad 00 00 00 05 00 00 00 00 21 b1 ac - 2276: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 ae 00 00 00 05 00 00 00 00 d1 a5 4b - 2277: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 af 00 00 00 05 00 00 00 00 41 a8 d7 - 2278: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 b0 00 00 00 05 00 00 00 00 71 24 74 - 2279: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 b1 00 00 00 05 00 00 00 00 e1 29 e8 - 2280: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 b2 00 00 00 05 00 00 00 00 11 3d 0f -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 01 00 06 00 0f 00 fe 00 07 00 11 00 00 74 -2022-03-28T17:34:42.456110Z MSG src=74608145, dst=74608145, cmd=1, u1=25.7V, i1=0.06A, p1=1.5W, u2=25.4V, i2=0.07A, p2=1.7W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 31 13 85 00 1e 56 -2022-03-28T17:34:42.505675Z MSG src=74608145, dst=74608145, cmd=2, u=235.3V, f=49.97Hz, p=3.0W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 2281: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 b3 00 00 00 05 00 00 00 00 81 30 93 - 2282: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 b4 00 00 00 05 00 00 00 00 b1 16 82 - 2283: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 b5 00 00 00 05 00 00 00 00 21 1b 1e - 2284: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 b6 00 00 00 05 00 00 00 00 d1 0f f9 - 2285: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 b7 00 00 00 05 00 00 00 00 41 02 65 - 2286: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 b8 00 00 00 05 00 00 00 00 b1 43 db - 2287: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 b9 00 00 00 05 00 00 00 00 21 4e 47 - 2288: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 ba 00 00 00 05 00 00 00 00 d1 5a a0 - 2289: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 bb 00 00 00 05 00 00 00 00 41 57 3c - 2290: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 bc 00 00 00 05 00 00 00 00 71 71 2d -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 01 00 06 00 0f 00 ff 00 07 00 11 00 00 75 -2022-03-28T17:34:52.496914Z MSG src=74608145, dst=74608145, cmd=1, u1=25.7V, i1=0.06A, p1=1.5W, u2=25.5V, i2=0.07A, p2=1.7W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 30 13 85 00 1e 57 -2022-03-28T17:34:52.546525Z MSG src=74608145, dst=74608145, cmd=2, u=235.2V, f=49.97Hz, p=3.0W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 2291: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 bd 00 00 00 05 00 00 00 00 e1 7c b1 - 2292: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 be 00 00 00 05 00 00 00 00 11 68 56 - 2293: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 bf 00 00 00 05 00 00 00 00 81 65 ca - 2294: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 c0 00 00 00 05 00 00 00 00 b3 41 a3 - 2295: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 c1 00 00 00 05 00 00 00 00 23 4c 3f - 2296: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 c2 00 00 00 05 00 00 00 00 d3 58 d8 - 2297: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 c3 00 00 00 05 00 00 00 00 43 55 44 - 2298: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 c4 00 00 00 05 00 00 00 00 73 73 55 - 2299: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 c5 00 00 00 05 00 00 00 00 e3 7e c9 - 2300: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 c6 00 00 00 05 00 00 00 00 13 6a 2e - 2301: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 c7 00 00 00 05 00 00 00 00 83 67 b2 - 2302: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 c8 00 00 00 05 00 00 00 00 73 26 0c - 2303: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 c9 00 00 00 05 00 00 00 00 e3 2b 90 - 2304: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 ca 00 00 00 05 00 00 00 00 13 3f 77 - 2305: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 cb 00 00 00 05 00 00 00 00 83 32 eb - 2306: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 cc 00 00 00 05 00 00 00 00 b3 14 fa - 2307: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 cd 00 00 00 05 00 00 00 00 23 19 66 - 2308: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 ce 00 00 00 05 00 00 00 00 d3 0d 81 - 2309: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 cf 00 00 00 05 00 00 00 00 43 00 1d - 2310: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 d0 00 00 00 05 00 00 00 00 73 8c be - 2311: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 d1 00 00 00 05 00 00 00 00 e3 81 22 - 2312: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 d2 00 00 00 05 00 00 00 00 13 95 c5 - 2313: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 d3 00 00 00 05 00 00 00 00 83 98 59 - 2314: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 d4 00 00 00 05 00 00 00 00 b3 be 48 - 2315: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 d5 00 00 00 05 00 00 00 00 23 b3 d4 - 2316: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 d6 00 00 00 05 00 00 00 00 d3 a7 33 - 2317: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 d7 00 00 00 05 00 00 00 00 43 aa af - 2318: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 d8 00 00 00 05 00 00 00 00 b3 eb 11 - 2319: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 d9 00 00 00 05 00 00 00 00 23 e6 8d - 2320: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 da 00 00 00 05 00 00 00 00 d3 f2 6a -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 00 00 06 00 0e 00 fe 00 06 00 10 00 00 74 -2022-03-28T17:35:22.613589Z MSG src=74608145, dst=74608145, cmd=1, u1=25.6V, i1=0.06A, p1=1.4W, u2=25.4V, i2=0.06A, p2=1.6W, unknown1=1, unknown2=0 - 2321: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 db 00 00 00 05 00 00 00 00 43 ff f6 - 2322: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 dc 00 00 00 05 00 00 00 00 73 d9 e7 - 2323: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 dd 00 00 00 05 00 00 00 00 e3 d4 7b -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 00 00 05 00 0e 00 ff 00 06 00 10 00 00 76 -2022-03-28T17:35:25.623678Z MSG src=74608145, dst=74608145, cmd=1, u1=25.6V, i1=0.05A, p1=1.4W, u2=25.5V, i2=0.06A, p2=1.6W, unknown1=1, unknown2=0 - 2324: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 de 00 00 00 05 00 00 00 00 13 c0 9c - 2325: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 df 00 00 00 05 00 00 00 00 83 cd 00 - 2326: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 e0 00 00 00 05 00 00 00 00 72 d8 db - 2327: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 e1 00 00 00 05 00 00 00 00 e2 d5 47 - 2328: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 e2 00 00 00 05 00 00 00 00 12 c1 a0 - 2329: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 e3 00 00 00 05 00 00 00 00 82 cc 3c - 2330: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 e4 00 00 00 05 00 00 00 00 b2 ea 2d -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 ff 00 05 00 0e 00 fe 00 06 00 10 00 00 89 -2022-03-28T17:35:32.653954Z MSG src=74608145, dst=74608145, cmd=1, u1=25.5V, i1=0.05A, p1=1.4W, u2=25.4V, i2=0.06A, p2=1.6W, unknown1=1, unknown2=0 - 2331: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 e5 00 00 00 05 00 00 00 00 22 e7 b1 - 2332: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 e6 00 00 00 05 00 00 00 00 d2 f3 56 - 2333: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 e7 00 00 00 05 00 00 00 00 42 fe ca -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 00 00 05 00 0e 01 00 00 06 00 10 00 00 88 -2022-03-28T17:35:35.663985Z MSG src=74608145, dst=74608145, cmd=1, u1=25.6V, i1=0.05A, p1=1.4W, u2=25.6V, i2=0.06A, p2=1.6W, unknown1=1, unknown2=0 - 2334: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 e8 00 00 00 05 00 00 00 00 b2 bf 74 - 2335: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 e9 00 00 00 05 00 00 00 00 22 b2 e8 - 2336: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 ea 00 00 00 05 00 00 00 00 d2 a6 0f - 2337: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 eb 00 00 00 05 00 00 00 00 42 ab 93 - 2338: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 ec 00 00 00 05 00 00 00 00 72 8d 82 - 2339: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 ed 00 00 00 05 00 00 00 00 e2 80 1e - 2340: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 ee 00 00 00 05 00 00 00 00 12 94 f9 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 ff 00 05 00 0e 00 ff 00 06 00 10 00 00 88 -2022-03-28T17:35:42.694205Z MSG src=74608145, dst=74608145, cmd=1, u1=25.5V, i1=0.05A, p1=1.4W, u2=25.5V, i2=0.06A, p2=1.6W, unknown1=1, unknown2=0 - 2341: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 ef 00 00 00 05 00 00 00 00 82 99 65 - 2342: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 f0 00 00 00 05 00 00 00 00 b2 15 c6 - 2343: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 f1 00 00 00 05 00 00 00 00 22 18 5a - 2344: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 f2 00 00 00 05 00 00 00 00 d2 0c bd - 2345: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 f3 00 00 00 05 00 00 00 00 42 01 21 - 2346: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 f4 00 00 00 05 00 00 00 00 72 27 30 - 2347: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 f5 00 00 00 05 00 00 00 00 e2 2a ac - 2348: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 f6 00 00 00 05 00 00 00 00 12 3e 4b - 2349: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 f7 00 00 00 05 00 00 00 00 82 33 d7 - 2350: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 f8 00 00 00 05 00 00 00 00 72 72 69 - 2351: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 f9 00 00 00 05 00 00 00 00 e2 7f f5 - 2352: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 fa 00 00 00 05 00 00 00 00 12 6b 12 - 2353: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 fb 00 00 00 05 00 00 00 00 82 66 8e - 2354: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 fc 00 00 00 05 00 00 00 00 b2 40 9f - 2355: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 fd 00 00 00 05 00 00 00 00 22 4d 03 - 2356: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 fe 00 00 00 05 00 00 00 00 d2 59 e4 - 2357: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f1 ff 00 00 00 05 00 00 00 00 42 54 78 - 2358: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 00 00 00 00 05 00 00 00 00 b9 e1 ca - 2359: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 01 00 00 00 05 00 00 00 00 29 ec 56 - 2360: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 02 00 00 00 05 00 00 00 00 d9 f8 b1 - 2361: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 03 00 00 00 05 00 00 00 00 49 f5 2d - 2362: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 04 00 00 00 05 00 00 00 00 79 d3 3c - 2363: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 05 00 00 00 05 00 00 00 00 e9 de a0 - 2364: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 06 00 00 00 05 00 00 00 00 19 ca 47 - 2365: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 07 00 00 00 05 00 00 00 00 89 c7 db - 2366: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 08 00 00 00 05 00 00 00 00 79 86 65 - 2367: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 09 00 00 00 05 00 00 00 00 e9 8b f9 - 2368: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 0a 00 00 00 05 00 00 00 00 19 9f 1e - 2369: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 0b 00 00 00 05 00 00 00 00 89 92 82 - 2370: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 0c 00 00 00 05 00 00 00 00 b9 b4 93 - 2371: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 0d 00 00 00 05 00 00 00 00 29 b9 0f - 2372: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 0e 00 00 00 05 00 00 00 00 d9 ad e8 - 2373: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 0f 00 00 00 05 00 00 00 00 49 a0 74 - 2374: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 10 00 00 00 05 00 00 00 00 79 2c d7 - 2375: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 11 00 00 00 05 00 00 00 00 e9 21 4b - 2376: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 12 00 00 00 05 00 00 00 00 19 35 ac - 2377: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 13 00 00 00 05 00 00 00 00 89 38 30 - 2378: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 14 00 00 00 05 00 00 00 00 b9 1e 21 - 2379: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 15 00 00 00 05 00 00 00 00 29 13 bd - 2380: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 16 00 00 00 05 00 00 00 00 d9 07 5a -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 fe 00 05 00 0d 00 fe 00 06 00 0f 00 00 94 -2022-03-28T17:36:22.849172Z MSG src=74608145, dst=74608145, cmd=1, u1=25.4V, i1=0.05A, p1=1.3W, u2=25.4V, i2=0.06A, p2=1.5W, unknown1=1, unknown2=0 - 2381: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 17 00 00 00 05 00 00 00 00 49 0a c6 - 2382: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 18 00 00 00 05 00 00 00 00 b9 4b 78 - 2383: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 19 00 00 00 05 00 00 00 00 29 46 e4 - 2384: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 1a 00 00 00 05 00 00 00 00 d9 52 03 - 2385: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 1b 00 00 00 05 00 00 00 00 49 5f 9f - 2386: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 1c 00 00 00 05 00 00 00 00 79 79 8e - 2387: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 1d 00 00 00 05 00 00 00 00 e9 74 12 - 2388: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 1e 00 00 00 05 00 00 00 00 19 60 f5 - 2389: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 1f 00 00 00 05 00 00 00 00 89 6d 69 - 2390: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 20 00 00 00 05 00 00 00 00 78 78 b2 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 ff 00 05 00 0d 00 ff 00 06 00 0f 00 00 94 -2022-03-28T17:36:32.889083Z MSG src=74608145, dst=74608145, cmd=1, u1=25.5V, i1=0.05A, p1=1.3W, u2=25.5V, i2=0.06A, p2=1.5W, unknown1=1, unknown2=0 - 2391: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 21 00 00 00 05 00 00 00 00 e8 75 2e - 2392: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 22 00 00 00 05 00 00 00 00 18 61 c9 - 2393: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 23 00 00 00 05 00 00 00 00 88 6c 55 - 2394: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 24 00 00 00 05 00 00 00 00 b8 4a 44 - 2395: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 25 00 00 00 05 00 00 00 00 28 47 d8 - 2396: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 26 00 00 00 05 00 00 00 00 d8 53 3f - 2397: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 27 00 00 00 05 00 00 00 00 48 5e a3 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 00 00 05 00 0d 00 fe 00 06 00 0e 00 00 6a -2022-03-28T17:36:39.918843Z MSG src=74608145, dst=74608145, cmd=1, u1=25.6V, i1=0.05A, p1=1.3W, u2=25.4V, i2=0.06A, p2=1.4W, unknown1=1, unknown2=0 - 2398: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 28 00 00 00 05 00 00 00 00 b8 1f 1d - 2399: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 29 00 00 00 05 00 00 00 00 28 12 81 - 2400: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 2a 00 00 00 05 00 00 00 00 d8 06 66 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 00 00 05 00 0d 00 fc 00 06 00 0e 00 00 68 -2022-03-28T17:36:42.928770Z MSG src=74608145, dst=74608145, cmd=1, u1=25.6V, i1=0.05A, p1=1.3W, u2=25.2V, i2=0.06A, p2=1.4W, unknown1=1, unknown2=0 - 2401: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 2b 00 00 00 05 00 00 00 00 48 0b fa - 2402: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 2c 00 00 00 05 00 00 00 00 78 2d eb - 2403: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 2d 00 00 00 05 00 00 00 00 e8 20 77 - 2404: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 2e 00 00 00 05 00 00 00 00 18 34 90 - 2405: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 2f 00 00 00 05 00 00 00 00 88 39 0c - 2406: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 30 00 00 00 05 00 00 00 00 b8 b5 af - 2407: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 31 00 00 00 05 00 00 00 00 28 b8 33 - 2408: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 32 00 00 00 05 00 00 00 00 d8 ac d4 - 2409: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 33 00 00 00 05 00 00 00 00 48 a1 48 - 2410: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 34 00 00 00 05 00 00 00 00 78 87 59 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 fe 00 05 00 0c 00 fc 00 06 00 0e 00 00 96 -2022-03-28T17:36:52.968470Z MSG src=74608145, dst=74608145, cmd=1, u1=25.4V, i1=0.05A, p1=1.2W, u2=25.2V, i2=0.06A, p2=1.4W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 2e 13 86 00 19 4d -2022-03-28T17:36:53.018058Z MSG src=74608145, dst=74608145, cmd=2, u=235.0V, f=49.98Hz, p=2.5W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 2411: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 35 00 00 00 05 00 00 00 00 e8 8a c5 - 2412: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 36 00 00 00 05 00 00 00 00 18 9e 22 - 2413: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 37 00 00 00 05 00 00 00 00 88 93 be - 2414: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 38 00 00 00 05 00 00 00 00 78 d2 00 - 2415: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 39 00 00 00 05 00 00 00 00 e8 df 9c - 2416: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 3a 00 00 00 05 00 00 00 00 18 cb 7b - 2417: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 3b 00 00 00 05 00 00 00 00 88 c6 e7 - 2418: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 3c 00 00 00 05 00 00 00 00 b8 e0 f6 - 2419: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 3d 00 00 00 05 00 00 00 00 28 ed 6a - 2420: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 3e 00 00 00 05 00 00 00 00 d8 f9 8d - 2421: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 3f 00 00 00 05 00 00 00 00 48 f4 11 - 2422: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 40 00 00 00 05 00 00 00 00 7a d0 78 - 2423: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 42 00 00 00 05 00 00 00 00 1a c9 03 - 2424: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 43 00 00 00 05 00 00 00 00 8a c4 9f - 2425: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 44 00 00 00 05 00 00 00 00 ba e2 8e - 2426: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 45 00 00 00 05 00 00 00 00 2a ef 12 - 2427: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 46 00 00 00 05 00 00 00 00 da fb f5 - 2428: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 47 00 00 00 05 00 00 00 00 4a f6 69 - 2429: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 48 00 00 00 05 00 00 00 00 ba b7 d7 - 2430: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 49 00 00 00 05 00 00 00 00 2a ba 4b - 2431: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 4a 00 00 00 05 00 00 00 00 da ae ac - 2432: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 4b 00 00 00 05 00 00 00 00 4a a3 30 - 2433: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 4c 00 00 00 05 00 00 00 00 7a 85 21 - 2434: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 4d 00 00 00 05 00 00 00 00 ea 88 bd - 2435: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 4e 00 00 00 05 00 00 00 00 1a 9c 5a - 2436: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 4f 00 00 00 05 00 00 00 00 8a 91 c6 - 2437: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 50 00 00 00 05 00 00 00 00 ba 1d 65 - 2438: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 51 00 00 00 05 00 00 00 00 2a 10 f9 - 2439: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 52 00 00 00 05 00 00 00 00 da 04 1e - 2440: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 53 00 00 00 05 00 00 00 00 4a 09 82 - 2441: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 54 00 00 00 05 00 00 00 00 7a 2f 93 - 2442: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 55 00 00 00 05 00 00 00 00 ea 22 0f - 2443: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 56 00 00 00 05 00 00 00 00 1a 36 e8 - 2444: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 57 00 00 00 05 00 00 00 00 8a 3b 74 - 2445: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 58 00 00 00 05 00 00 00 00 7a 7a ca - 2446: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 59 00 00 00 05 00 00 00 00 ea 77 56 - 2447: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 5a 00 00 00 05 00 00 00 00 1a 63 b1 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 ff 00 05 00 0c 00 fd 00 05 00 0d 00 00 96 -2022-03-28T17:37:30.111947Z MSG src=74608145, dst=74608145, cmd=1, u1=25.5V, i1=0.05A, p1=1.2W, u2=25.3V, i2=0.05A, p2=1.3W, unknown1=1, unknown2=0 - 2448: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 5b 00 00 00 05 00 00 00 00 8a 6e 2d - 2449: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 5c 00 00 00 05 00 00 00 00 ba 48 3c - 2450: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 5d 00 00 00 05 00 00 00 00 2a 45 a0 - 2451: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 5e 00 00 00 05 00 00 00 00 da 51 47 - 2452: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 5f 00 00 00 05 00 00 00 00 4a 5c db - 2453: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 60 00 00 00 05 00 00 00 00 bb 49 00 - 2454: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 61 00 00 00 05 00 00 00 00 2b 44 9c -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 ff 00 05 00 0c 00 fc 00 05 00 0d 00 00 97 -2022-03-28T17:37:37.141572Z MSG src=74608145, dst=74608145, cmd=1, u1=25.5V, i1=0.05A, p1=1.2W, u2=25.2V, i2=0.05A, p2=1.3W, unknown1=1, unknown2=0 - 2455: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 62 00 00 00 05 00 00 00 00 db 50 7b - 2456: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 63 00 00 00 05 00 00 00 00 4b 5d e7 - 2457: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 64 00 00 00 05 00 00 00 00 7b 7b f6 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 ff 00 05 00 0c 00 fb 00 05 00 0d 00 00 90 -2022-03-28T17:37:40.151417Z MSG src=74608145, dst=74608145, cmd=1, u1=25.5V, i1=0.05A, p1=1.2W, u2=25.1V, i2=0.05A, p2=1.3W, unknown1=1, unknown2=0 - 2458: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 65 00 00 00 05 00 00 00 00 eb 76 6a - 2459: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 66 00 00 00 05 00 00 00 00 1b 62 8d - 2460: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 67 00 00 00 05 00 00 00 00 8b 6f 11 - 2461: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 68 00 00 00 05 00 00 00 00 7b 2e af - 2462: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 69 00 00 00 05 00 00 00 00 eb 23 33 - 2463: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 6a 00 00 00 05 00 00 00 00 1b 37 d4 - 2464: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 6b 00 00 00 05 00 00 00 00 8b 3a 48 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 fe 00 05 00 0c 00 fc 00 05 00 0d 00 00 96 -2022-03-28T17:37:47.181061Z MSG src=74608145, dst=74608145, cmd=1, u1=25.4V, i1=0.05A, p1=1.2W, u2=25.2V, i2=0.05A, p2=1.3W, unknown1=1, unknown2=0 - 2465: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 6c 00 00 00 05 00 00 00 00 bb 1c 59 - 2466: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 6d 00 00 00 05 00 00 00 00 2b 11 c5 - 2467: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 6e 00 00 00 05 00 00 00 00 db 05 22 - 2468: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 6f 00 00 00 05 00 00 00 00 4b 08 be - 2469: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 70 00 00 00 05 00 00 00 00 7b 84 1d - 2470: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 71 00 00 00 05 00 00 00 00 eb 89 81 - 2471: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 72 00 00 00 05 00 00 00 00 1b 9d 66 - 2472: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 73 00 00 00 05 00 00 00 00 8b 90 fa - 2473: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 74 00 00 00 05 00 00 00 00 bb b6 eb - 2474: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 75 00 00 00 05 00 00 00 00 2b bb 77 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 ff 00 04 00 0b 00 fc 00 05 00 0d 00 00 91 -2022-03-28T17:37:57.220485Z MSG src=74608145, dst=74608145, cmd=1, u1=25.5V, i1=0.04A, p1=1.1W, u2=25.2V, i2=0.05A, p2=1.3W, unknown1=1, unknown2=0 - 2475: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 76 00 00 00 05 00 00 00 00 db af 90 - 2476: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 77 00 00 00 05 00 00 00 00 4b a2 0c - 2477: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 78 00 00 00 05 00 00 00 00 bb e3 b2 - 2478: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 79 00 00 00 05 00 00 00 00 2b ee 2e - 2479: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 7a 00 00 00 05 00 00 00 00 db fa c9 - 2480: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 7b 00 00 00 05 00 00 00 00 4b f7 55 - 2481: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 7c 00 00 00 05 00 00 00 00 7b d1 44 - 2482: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 7d 00 00 00 05 00 00 00 00 eb dc d8 - 2483: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 7e 00 00 00 05 00 00 00 00 1b c8 3f - 2484: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 7f 00 00 00 05 00 00 00 00 8b c5 a3 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 2b 13 87 00 17 47 -2022-03-28T17:38:07.309501Z MSG src=74608145, dst=74608145, cmd=2, u=234.7V, f=49.99Hz, p=2.3W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 2485: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 80 00 00 00 05 00 00 00 00 7f 80 ed - 2486: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 81 00 00 00 05 00 00 00 00 ef 8d 71 - 2487: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 82 00 00 00 05 00 00 00 00 1f 99 96 - 2488: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 83 00 00 00 05 00 00 00 00 8f 94 0a - 2489: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 84 00 00 00 05 00 00 00 00 bf b2 1b - 2490: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 85 00 00 00 05 00 00 00 00 2f bf 87 - 2491: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 86 00 00 00 05 00 00 00 00 df ab 60 - 2492: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 87 00 00 00 05 00 00 00 00 4f a6 fc - 2493: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 88 00 00 00 05 00 00 00 00 bf e7 42 - 2494: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 89 00 00 00 05 00 00 00 00 2f ea de - 2495: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 8a 00 00 00 05 00 00 00 00 df fe 39 - 2496: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 8b 00 00 00 05 00 00 00 00 4f f3 a5 - 2497: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 8c 00 00 00 05 00 00 00 00 7f d5 b4 - 2498: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 8d 00 00 00 05 00 00 00 00 ef d8 28 - 2499: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 8e 00 00 00 05 00 00 00 00 1f cc cf - 2500: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 8f 00 00 00 05 00 00 00 00 8f c1 53 - 2501: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 90 00 00 00 05 00 00 00 00 bf 4d f0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 01 00 04 00 0b 00 fc 00 05 00 0c 00 00 6f -2022-03-28T17:38:24.329076Z MSG src=74608145, dst=74608145, cmd=1, u1=25.7V, i1=0.04A, p1=1.1W, u2=25.2V, i2=0.05A, p2=1.2W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 ba 06 7f 06 82 09 2b 13 86 00 16 47 -2022-03-28T17:38:24.378337Z MSG src=74608145, dst=74608145, cmd=2, u=234.7V, f=49.98Hz, p=2.2W, uk1=12851, uk2=0, uk3=14266, uk4=1663, uk5=1666 - 2502: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 91 00 00 00 05 00 00 00 00 2f 40 6c - 2503: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 92 00 00 00 05 00 00 00 00 df 54 8b - 2504: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 93 00 00 00 05 00 00 00 00 4f 59 17 - 2505: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 94 00 00 00 05 00 00 00 00 7f 7f 06 - 2506: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 95 00 00 00 05 00 00 00 00 ef 72 9a - 2507: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 96 00 00 00 05 00 00 00 00 1f 66 7d - 2508: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 97 00 00 00 05 00 00 00 00 8f 6b e1 - 2509: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 98 00 00 00 05 00 00 00 00 7f 2a 5f - 2510: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 99 00 00 00 05 00 00 00 00 ef 27 c3 - 2511: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 9a 00 00 00 05 00 00 00 00 1f 33 24 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 fd 00 04 00 0b 00 fb 00 05 00 0c 00 00 95 -2022-03-28T17:38:34.368040Z MSG src=74608145, dst=74608145, cmd=1, u1=25.3V, i1=0.04A, p1=1.1W, u2=25.1V, i2=0.05A, p2=1.2W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 2c 13 86 00 16 40 -2022-03-28T17:38:34.417683Z MSG src=74608145, dst=74608145, cmd=2, u=234.8V, f=49.98Hz, p=2.2W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 2512: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 9b 00 00 00 05 00 00 00 00 8f 3e b8 - 2513: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 9c 00 00 00 05 00 00 00 00 bf 18 a9 - 2514: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 9d 00 00 00 05 00 00 00 00 2f 15 35 - 2515: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 9e 00 00 00 05 00 00 00 00 df 01 d2 - 2516: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 9f 00 00 00 05 00 00 00 00 4f 0c 4e - 2517: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 a0 00 00 00 05 00 00 00 00 be 19 95 - 2518: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 a1 00 00 00 05 00 00 00 00 2e 14 09 - 2519: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 a2 00 00 00 05 00 00 00 00 de 00 ee - 2520: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 a3 00 00 00 05 00 00 00 00 4e 0d 72 - 2521: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 a4 00 00 00 05 00 00 00 00 7e 2b 63 - 2522: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 a5 00 00 00 05 00 00 00 00 ee 26 ff - 2523: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 a6 00 00 00 05 00 00 00 00 1e 32 18 - 2524: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 a7 00 00 00 05 00 00 00 00 8e 3f 84 - 2525: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 a8 00 00 00 05 00 00 00 00 7e 7e 3a -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 ff 00 04 00 0b 00 fa 00 05 00 0c 00 00 96 -2022-03-28T17:38:48.427045Z MSG src=74608145, dst=74608145, cmd=1, u1=25.5V, i1=0.04A, p1=1.1W, u2=25.0V, i2=0.05A, p2=1.2W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 2d 13 89 00 15 4d -2022-03-28T17:38:48.476683Z MSG src=74608145, dst=74608145, cmd=2, u=234.9V, f=50.01Hz, p=2.1W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 2526: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 a9 00 00 00 05 00 00 00 00 ee 73 a6 - 2527: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 aa 00 00 00 05 00 00 00 00 1e 67 41 - 2528: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 ab 00 00 00 05 00 00 00 00 8e 6a dd - 2529: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 ac 00 00 00 05 00 00 00 00 be 4c cc - 2530: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 ad 00 00 00 05 00 00 00 00 2e 41 50 - 2531: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 ae 00 00 00 05 00 00 00 00 de 55 b7 - 2532: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 af 00 00 00 05 00 00 00 00 4e 58 2b - 2533: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 b0 00 00 00 05 00 00 00 00 7e d4 88 - 2534: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 b1 00 00 00 05 00 00 00 00 ee d9 14 - 2535: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 b2 00 00 00 05 00 00 00 00 1e cd f3 - 2536: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 b3 00 00 00 05 00 00 00 00 8e c0 6f - 2537: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 b4 00 00 00 05 00 00 00 00 be e6 7e - 2538: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 b5 00 00 00 05 00 00 00 00 2e eb e2 - 2539: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 b6 00 00 00 05 00 00 00 00 de ff 05 - 2540: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 b7 00 00 00 05 00 00 00 00 4e f2 99 - 2541: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 b8 00 00 00 05 00 00 00 00 be b3 27 - 2542: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 b9 00 00 00 05 00 00 00 00 2e be bb -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 00 00 04 00 0a 00 fa 00 05 00 0c 00 00 69 -2022-03-28T17:39:05.490832Z MSG src=74608145, dst=74608145, cmd=1, u1=25.6V, i1=0.04A, p1=1.0W, u2=25.0V, i2=0.05A, p2=1.2W, unknown1=1, unknown2=0 - 2543: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 ba 00 00 00 05 00 00 00 00 de aa 5c - 2544: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 bb 00 00 00 05 00 00 00 00 4e a7 c0 - 2545: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 bc 00 00 00 05 00 00 00 00 7e 81 d1 - 2546: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 bd 00 00 00 05 00 00 00 00 ee 8c 4d - 2547: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 be 00 00 00 05 00 00 00 00 1e 98 aa - 2548: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 bf 00 00 00 05 00 00 00 00 8e 95 36 - 2549: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 c0 00 00 00 05 00 00 00 00 bc b1 5f -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1b 00 02 00 07 01 1c 00 03 00 08 00 00 9c -2022-03-28T17:39:12.520174Z MSG src=74608145, dst=74608145, cmd=1, u1=28.3V, i1=0.02A, p1=0.7W, u2=28.4V, i2=0.03A, p2=0.8W, unknown1=1, unknown2=0 - 2550: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 c1 00 00 00 05 00 00 00 00 2c bc c3 - 2551: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 c2 00 00 00 05 00 00 00 00 dc a8 24 - 2552: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 c3 00 00 00 05 00 00 00 00 4c a5 b8 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1c 00 02 00 06 01 1d 00 03 00 07 00 00 94 -2022-03-28T17:39:15.530013Z MSG src=74608145, dst=74608145, cmd=1, u1=28.4V, i1=0.02A, p1=0.6W, u2=28.5V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2553: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 c4 00 00 00 05 00 00 00 00 7c 83 a9 - 2554: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 c5 00 00 00 05 00 00 00 00 ec 8e 35 - 2555: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 c6 00 00 00 05 00 00 00 00 1c 9a d2 - 2556: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 c7 00 00 00 05 00 00 00 00 8c 97 4e - 2557: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 c8 00 00 00 05 00 00 00 00 7c d6 f0 - 2558: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 c9 00 00 00 05 00 00 00 00 ec db 6c - 2559: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 ca 00 00 00 05 00 00 00 00 1c cf 8b - 2560: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 cb 00 00 00 05 00 00 00 00 8c c2 17 - 2561: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 cc 00 00 00 05 00 00 00 00 bc e4 06 - 2562: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 cd 00 00 00 05 00 00 00 00 2c e9 9a - 2563: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 ce 00 00 00 05 00 00 00 00 dc fd 7d - 2564: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 cf 00 00 00 05 00 00 00 00 4c f0 e1 - 2565: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 d0 00 00 00 05 00 00 00 00 7c 7c 42 - 2566: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 d1 00 00 00 05 00 00 00 00 ec 71 de - 2567: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 d2 00 00 00 05 00 00 00 00 1c 65 39 - 2568: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 d3 00 00 00 05 00 00 00 00 8c 68 a5 - 2569: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 d4 00 00 00 05 00 00 00 00 bc 4e b4 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1c 00 02 00 06 01 1c 00 03 00 07 00 00 95 -2022-03-28T17:39:32.598614Z MSG src=74608145, dst=74608145, cmd=1, u1=28.4V, i1=0.02A, p1=0.6W, u2=28.4V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2570: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 d5 00 00 00 05 00 00 00 00 2c 43 28 - 2571: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 d6 00 00 00 05 00 00 00 00 dc 57 cf - 2572: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 d7 00 00 00 05 00 00 00 00 4c 5a 53 - 2573: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 d8 00 00 00 05 00 00 00 00 bc 1b ed - 2574: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 d9 00 00 00 05 00 00 00 00 2c 16 71 - 2575: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 da 00 00 00 05 00 00 00 00 dc 02 96 - 2576: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 db 00 00 00 05 00 00 00 00 4c 0f 0a - 2577: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 dc 00 00 00 05 00 00 00 00 7c 29 1b - 2578: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 dd 00 00 00 05 00 00 00 00 ec 24 87 - 2579: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 de 00 00 00 05 00 00 00 00 1c 30 60 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 1b 00 02 00 06 01 1b 00 03 00 07 00 00 95 -2022-03-28T17:39:42.637792Z MSG src=74608145, dst=74608145, cmd=1, u1=28.3V, i1=0.02A, p1=0.6W, u2=28.3V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 2d 13 87 00 00 56 -2022-03-28T17:39:42.687445Z MSG src=74608145, dst=74608145, cmd=2, u=234.9V, f=49.99Hz, p=0.0W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 2580: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 df 00 00 00 05 00 00 00 00 8c 3d fc - 2581: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 e0 00 00 00 05 00 00 00 00 7d 28 27 - 2582: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 e1 00 00 00 05 00 00 00 00 ed 25 bb - 2583: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 e2 00 00 00 05 00 00 00 00 1d 31 5c - 2584: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 e3 00 00 00 05 00 00 00 00 8d 3c c0 - 2585: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 e4 00 00 00 05 00 00 00 00 bd 1a d1 - 2586: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 e5 00 00 00 05 00 00 00 00 2d 17 4d - 2587: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 e6 00 00 00 05 00 00 00 00 dd 03 aa - 2588: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 e7 00 00 00 05 00 00 00 00 4d 0e 36 - 2589: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 e8 00 00 00 05 00 00 00 00 bd 4f 88 - 2590: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 e9 00 00 00 05 00 00 00 00 2d 42 14 - 2591: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 ea 00 00 00 05 00 00 00 00 dd 56 f3 - 2592: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 eb 00 00 00 05 00 00 00 00 4d 5b 6f - 2593: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 ec 00 00 00 05 00 00 00 00 7d 7d 7e - 2594: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 ed 00 00 00 05 00 00 00 00 ed 70 e2 - 2595: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 ee 00 00 00 05 00 00 00 00 1d 64 05 - 2596: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 ef 00 00 00 05 00 00 00 00 8d 69 99 - 2597: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 f0 00 00 00 05 00 00 00 00 bd e5 3a - 2598: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 f1 00 00 00 05 00 00 00 00 2d e8 a6 - 2599: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 f2 00 00 00 05 00 00 00 00 dd fc 41 - 2600: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 f3 00 00 00 05 00 00 00 00 4d f1 dd - 2601: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 f4 00 00 00 05 00 00 00 00 7d d7 cc - 2602: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 f5 00 00 00 05 00 00 00 00 ed da 50 - 2603: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 f6 00 00 00 05 00 00 00 00 1d ce b7 - 2604: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 f7 00 00 00 05 00 00 00 00 8d c3 2b - 2605: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 f8 00 00 00 05 00 00 00 00 7d 82 95 - 2606: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 f9 00 00 00 05 00 00 00 00 ed 8f 09 - 2607: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 fa 00 00 00 05 00 00 00 00 1d 9b ee - 2608: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 fb 00 00 00 05 00 00 00 00 8d 96 72 - 2609: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 fc 00 00 00 05 00 00 00 00 bd b0 63 - 2610: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 fd 00 00 00 05 00 00 00 00 2d bd ff - 2611: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 fe 00 00 00 05 00 00 00 00 dd a9 18 - 2612: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f2 ff 00 00 00 05 00 00 00 00 4d a4 84 - 2613: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 00 00 00 00 05 00 00 00 00 7c b0 5f - 2614: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 01 00 00 00 05 00 00 00 00 ec bd c3 - 2615: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 02 00 00 00 05 00 00 00 00 1c a9 24 - 2616: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 03 00 00 00 05 00 00 00 00 8c a4 b8 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 18 00 02 00 06 01 19 00 03 00 07 00 00 94 -2022-03-28T17:40:19.779659Z MSG src=74608145, dst=74608145, cmd=1, u1=28.0V, i1=0.02A, p1=0.6W, u2=28.1V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2617: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 04 00 00 00 05 00 00 00 00 bc 82 a9 - 2618: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 05 00 00 00 05 00 00 00 00 2c 8f 35 - 2619: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 06 00 00 00 05 00 00 00 00 dc 9b d2 - 2620: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 07 00 00 00 05 00 00 00 00 4c 96 4e - 2621: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 08 00 00 00 05 00 00 00 00 bc d7 f0 - 2622: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 09 00 00 00 05 00 00 00 00 2c da 6c - 2623: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 0a 00 00 00 05 00 00 00 00 dc ce 8b -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 18 00 02 00 06 01 18 00 03 00 07 00 00 95 -2022-03-28T17:40:26.809084Z MSG src=74608145, dst=74608145, cmd=1, u1=28.0V, i1=0.02A, p1=0.6W, u2=28.0V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2624: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 0b 00 00 00 05 00 00 00 00 4c c3 17 - 2625: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 0c 00 00 00 05 00 00 00 00 7c e5 06 - 2626: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 0d 00 00 00 05 00 00 00 00 ec e8 9a - 2627: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 0e 00 00 00 05 00 00 00 00 1c fc 7d - 2628: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 0f 00 00 00 05 00 00 00 00 8c f1 e1 - 2629: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 10 00 00 00 05 00 00 00 00 bc 7d 42 - 2630: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 11 00 00 00 05 00 00 00 00 2c 70 de -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 17 00 02 00 06 01 18 00 03 00 07 00 00 9a -2022-03-28T17:40:33.838418Z MSG src=74608145, dst=74608145, cmd=1, u1=27.9V, i1=0.02A, p1=0.6W, u2=28.0V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2631: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 12 00 00 00 05 00 00 00 00 dc 64 39 - 2632: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 13 00 00 00 05 00 00 00 00 4c 69 a5 - 2633: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 14 00 00 00 05 00 00 00 00 7c 4f b4 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 17 00 02 00 06 01 17 00 03 00 07 00 00 95 -2022-03-28T17:40:36.848182Z MSG src=74608145, dst=74608145, cmd=1, u1=27.9V, i1=0.02A, p1=0.6W, u2=27.9V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2634: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 15 00 00 00 05 00 00 00 00 ec 42 28 - 2635: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 16 00 00 00 05 00 00 00 00 1c 56 cf - 2636: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 17 00 00 00 05 00 00 00 00 8c 5b 53 - 2637: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 18 00 00 00 05 00 00 00 00 7c 1a ed - 2638: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 19 00 00 00 05 00 00 00 00 ec 17 71 - 2639: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 1a 00 00 00 05 00 00 00 00 1c 03 96 - 2640: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 1b 00 00 00 05 00 00 00 00 8c 0e 0a -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 16 00 02 00 06 01 17 00 03 00 07 00 00 94 -2022-03-28T17:40:43.877584Z MSG src=74608145, dst=74608145, cmd=1, u1=27.8V, i1=0.02A, p1=0.6W, u2=27.9V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2641: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 1c 00 00 00 05 00 00 00 00 bc 28 1b - 2642: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 1d 00 00 00 05 00 00 00 00 2c 25 87 - 2643: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 1e 00 00 00 05 00 00 00 00 dc 31 60 - 2644: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 1f 00 00 00 05 00 00 00 00 4c 3c fc - 2645: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 20 00 00 00 05 00 00 00 00 bd 29 27 - 2646: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 21 00 00 00 05 00 00 00 00 2d 24 bb - 2647: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 22 00 00 00 05 00 00 00 00 dd 30 5c - 2648: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 23 00 00 00 05 00 00 00 00 4d 3d c0 - 2649: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 24 00 00 00 05 00 00 00 00 7d 1b d1 - 2650: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 25 00 00 00 05 00 00 00 00 ed 16 4d -Received 27 bytes on pipe 5: 95 74 60 81 45 74 60 81 45 01 00 01 01 15 00 02 00 06 01 16 00 03 00 07 00 00 96 -2022-03-28T17:40:53.916708Z MSG src=74608145, dst=74608145, cmd=1, u1=27.7V, i1=0.02A, p1=0.6W, u2=27.8V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2651: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 26 00 00 00 05 00 00 00 00 1d 02 aa - 2652: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 27 00 00 00 05 00 00 00 00 8d 0f 36 - 2653: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 28 00 00 00 05 00 00 00 00 7d 4e 88 - 2654: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 29 00 00 00 05 00 00 00 00 ed 43 14 - 2655: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 2a 00 00 00 05 00 00 00 00 1d 57 f3 - 2656: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 2b 00 00 00 05 00 00 00 00 8d 5a 6f - 2657: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 2c 00 00 00 05 00 00 00 00 bd 7c 7e -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 15 00 02 00 06 01 15 00 02 00 07 00 00 94 -2022-03-28T17:41:00.946041Z MSG src=74608145, dst=74608145, cmd=1, u1=27.7V, i1=0.02A, p1=0.6W, u2=27.7V, i2=0.02A, p2=0.7W, unknown1=1, unknown2=0 - 2658: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 2d 00 00 00 05 00 00 00 00 2d 71 e2 - 2659: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 2e 00 00 00 05 00 00 00 00 dd 65 05 - 2660: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 2f 00 00 00 05 00 00 00 00 4d 68 99 - 2661: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 30 00 00 00 05 00 00 00 00 7d e4 3a - 2662: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 31 00 00 00 05 00 00 00 00 ed e9 a6 - 2663: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 32 00 00 00 05 00 00 00 00 1d fd 41 - 2664: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 33 00 00 00 05 00 00 00 00 8d f0 dd - 2665: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 34 00 00 00 05 00 00 00 00 bd d6 cc - 2666: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 35 00 00 00 05 00 00 00 00 2d db 50 - 2667: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 36 00 00 00 05 00 00 00 00 dd cf b7 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 14 00 02 00 06 01 14 00 02 00 07 00 00 94 -2022-03-28T17:41:10.985638Z MSG src=74608145, dst=74608145, cmd=1, u1=27.6V, i1=0.02A, p1=0.6W, u2=27.6V, i2=0.02A, p2=0.7W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 2a 13 84 00 00 52 -2022-03-28T17:41:11.035311Z MSG src=74608145, dst=74608145, cmd=2, u=234.6V, f=49.96Hz, p=0.0W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 2668: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 37 00 00 00 05 00 00 00 00 4d c2 2b - 2669: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 38 00 00 00 05 00 00 00 00 bd 83 95 - 2670: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 39 00 00 00 05 00 00 00 00 2d 8e 09 - 2671: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 3a 00 00 00 05 00 00 00 00 dd 9a ee - 2672: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 3b 00 00 00 05 00 00 00 00 4d 97 72 - 2673: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 3c 00 00 00 05 00 00 00 00 7d b1 63 - 2674: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 3d 00 00 00 05 00 00 00 00 ed bc ff - 2675: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 3e 00 00 00 05 00 00 00 00 1d a8 18 - 2676: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 40 00 00 00 05 00 00 00 00 bf 81 ed - 2677: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 41 00 00 00 05 00 00 00 00 2f 8c 71 - 2678: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 42 00 00 00 05 00 00 00 00 df 98 96 - 2679: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 43 00 00 00 05 00 00 00 00 4f 95 0a - 2680: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 44 00 00 00 05 00 00 00 00 7f b3 1b - 2681: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 45 00 00 00 05 00 00 00 00 ef be 87 - 2682: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 46 00 00 00 05 00 00 00 00 1f aa 60 - 2683: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 47 00 00 00 05 00 00 00 00 8f a7 fc - 2684: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 48 00 00 00 05 00 00 00 00 7f e6 42 - 2685: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 49 00 00 00 05 00 00 00 00 ef eb de - 2686: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 4a 00 00 00 05 00 00 00 00 1f ff 39 - 2687: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 4b 00 00 00 05 00 00 00 00 8f f2 a5 - 2688: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 4c 00 00 00 05 00 00 00 00 bf d4 b4 - 2689: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 4d 00 00 00 05 00 00 00 00 2f d9 28 - 2690: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 4e 00 00 00 05 00 00 00 00 df cd cf - 2691: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 4f 00 00 00 05 00 00 00 00 4f c0 53 - 2692: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 50 00 00 00 05 00 00 00 00 7f 4c f0 - 2693: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 51 00 00 00 05 00 00 00 00 ef 41 6c - 2694: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 52 00 00 00 05 00 00 00 00 1f 55 8b - 2695: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 53 00 00 00 05 00 00 00 00 8f 58 17 - 2696: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 54 00 00 00 05 00 00 00 00 bf 7e 06 - 2697: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 55 00 00 00 05 00 00 00 00 2f 73 9a - 2698: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 56 00 00 00 05 00 00 00 00 df 67 7d - 2699: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 57 00 00 00 05 00 00 00 00 4f 6a e1 - 2700: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 58 00 00 00 05 00 00 00 00 bf 2b 5f -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 10 00 02 00 06 01 10 00 03 00 07 00 00 95 -2022-03-28T17:41:44.111526Z MSG src=74608145, dst=74608145, cmd=1, u1=27.2V, i1=0.02A, p1=0.6W, u2=27.2V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2701: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 59 00 00 00 05 00 00 00 00 2f 26 c3 - 2702: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 5a 00 00 00 05 00 00 00 00 df 32 24 - 2703: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 5b 00 00 00 05 00 00 00 00 4f 3f b8 - 2704: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 5c 00 00 00 05 00 00 00 00 7f 19 a9 - 2705: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 5d 00 00 00 05 00 00 00 00 ef 14 35 - 2706: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 5e 00 00 00 05 00 00 00 00 1f 00 d2 - 2707: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 5f 00 00 00 05 00 00 00 00 8f 0d 4e -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0f 00 02 00 06 01 10 00 03 00 07 00 00 8a -2022-03-28T17:41:51.141598Z MSG src=74608145, dst=74608145, cmd=1, u1=27.1V, i1=0.02A, p1=0.6W, u2=27.2V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2708: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 60 00 00 00 05 00 00 00 00 7e 18 95 - 2709: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 61 00 00 00 05 00 00 00 00 ee 15 09 - 2710: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 62 00 00 00 05 00 00 00 00 1e 01 ee -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0e 00 02 00 06 01 0f 00 03 00 07 00 00 94 -2022-03-28T17:41:54.151647Z MSG src=74608145, dst=74608145, cmd=1, u1=27.0V, i1=0.02A, p1=0.6W, u2=27.1V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2711: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 63 00 00 00 05 00 00 00 00 8e 0c 72 - 2712: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 64 00 00 00 05 00 00 00 00 be 2a 63 - 2713: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 65 00 00 00 05 00 00 00 00 2e 27 ff - 2714: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 66 00 00 00 05 00 00 00 00 de 33 18 - 2715: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 67 00 00 00 05 00 00 00 00 4e 3e 84 - 2716: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 68 00 00 00 05 00 00 00 00 be 7f 3a - 2717: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 69 00 00 00 05 00 00 00 00 2e 72 a6 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0e 00 02 00 06 01 0e 00 03 00 07 00 00 95 -2022-03-28T17:42:01.181753Z MSG src=74608145, dst=74608145, cmd=1, u1=27.0V, i1=0.02A, p1=0.6W, u2=27.0V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2718: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 6a 00 00 00 05 00 00 00 00 de 66 41 - 2719: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 6b 00 00 00 05 00 00 00 00 4e 6b dd - 2720: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 6c 00 00 00 05 00 00 00 00 7e 4d cc - 2721: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 6d 00 00 00 05 00 00 00 00 ee 40 50 - 2722: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 6e 00 00 00 05 00 00 00 00 1e 54 b7 - 2723: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 6f 00 00 00 05 00 00 00 00 8e 59 2b - 2724: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 70 00 00 00 05 00 00 00 00 be d5 88 - 2725: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 71 00 00 00 05 00 00 00 00 2e d8 14 - 2726: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 72 00 00 00 05 00 00 00 00 de cc f3 - 2727: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 73 00 00 00 05 00 00 00 00 4e c1 6f -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 0c 00 02 00 06 01 0c 00 03 00 07 00 00 95 -2022-03-28T17:42:11.221879Z MSG src=74608145, dst=74608145, cmd=1, u1=26.8V, i1=0.02A, p1=0.6W, u2=26.8V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 29 13 85 00 00 50 -2022-03-28T17:42:11.271493Z MSG src=74608145, dst=74608145, cmd=2, u=234.5V, f=49.97Hz, p=0.0W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 2728: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 74 00 00 00 05 00 00 00 00 7e e7 7e - 2729: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 75 00 00 00 05 00 00 00 00 ee ea e2 - 2730: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 76 00 00 00 05 00 00 00 00 1e fe 05 - 2731: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 77 00 00 00 05 00 00 00 00 8e f3 99 - 2732: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 78 00 00 00 05 00 00 00 00 7e b2 27 - 2733: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 79 00 00 00 05 00 00 00 00 ee bf bb - 2734: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 7a 00 00 00 05 00 00 00 00 1e ab 5c - 2735: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 7b 00 00 00 05 00 00 00 00 8e a6 c0 - 2736: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 7c 00 00 00 05 00 00 00 00 be 80 d1 - 2737: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 7d 00 00 00 05 00 00 00 00 2e 8d 4d - 2738: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 7e 00 00 00 05 00 00 00 00 de 99 aa - 2739: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 7f 00 00 00 05 00 00 00 00 4e 94 36 - 2740: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 80 00 00 00 05 00 00 00 00 ba d1 78 - 2741: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 81 00 00 00 05 00 00 00 00 2a dc e4 - 2742: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 82 00 00 00 05 00 00 00 00 da c8 03 - 2743: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 83 00 00 00 05 00 00 00 00 4a c5 9f - 2744: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 84 00 00 00 05 00 00 00 00 7a e3 8e - 2745: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 85 00 00 00 05 00 00 00 00 ea ee 12 - 2746: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 86 00 00 00 05 00 00 00 00 1a fa f5 - 2747: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 87 00 00 00 05 00 00 00 00 8a f7 69 - 2748: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 88 00 00 00 05 00 00 00 00 7a b6 d7 - 2749: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 89 00 00 00 05 00 00 00 00 ea bb 4b - 2750: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 8a 00 00 00 05 00 00 00 00 1a af ac - 2751: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 8b 00 00 00 05 00 00 00 00 8a a2 30 - 2752: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 8c 00 00 00 05 00 00 00 00 ba 84 21 - 2753: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 8d 00 00 00 05 00 00 00 00 2a 89 bd - 2754: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 8e 00 00 00 05 00 00 00 00 da 9d 5a - 2755: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 8f 00 00 00 05 00 00 00 00 4a 90 c6 - 2756: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 90 00 00 00 05 00 00 00 00 7a 1c 65 - 2757: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 91 00 00 00 05 00 00 00 00 ea 11 f9 - 2758: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 92 00 00 00 05 00 00 00 00 1a 05 1e - 2759: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 93 00 00 00 05 00 00 00 00 8a 08 82 - 2760: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 94 00 00 00 05 00 00 00 00 ba 2e 93 - 2761: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 95 00 00 00 05 00 00 00 00 2a 23 0f - 2762: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 96 00 00 00 05 00 00 00 00 da 37 e8 - 2763: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 97 00 00 00 05 00 00 00 00 4a 3a 74 - 2764: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 98 00 00 00 05 00 00 00 00 ba 7b ca - 2765: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 99 00 00 00 05 00 00 00 00 2a 76 56 - 2766: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 9a 00 00 00 05 00 00 00 00 da 62 b1 - 2767: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 9b 00 00 00 05 00 00 00 00 4a 6f 2d -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 05 00 02 00 06 01 05 00 03 00 07 00 00 95 -2022-03-28T17:42:51.376960Z MSG src=74608145, dst=74608145, cmd=1, u1=26.1V, i1=0.02A, p1=0.6W, u2=26.1V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2768: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 9c 00 00 00 05 00 00 00 00 7a 49 3c - 2769: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 9d 00 00 00 05 00 00 00 00 ea 44 a0 - 2770: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 9e 00 00 00 05 00 00 00 00 1a 50 47 - 2771: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 9f 00 00 00 05 00 00 00 00 8a 5d db - 2772: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 a0 00 00 00 05 00 00 00 00 7b 48 00 - 2773: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 a1 00 00 00 05 00 00 00 00 eb 45 9c - 2774: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 a2 00 00 00 05 00 00 00 00 1b 51 7b -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 03 00 02 00 06 01 04 00 03 00 07 00 00 92 -2022-03-28T17:42:58.406895Z MSG src=74608145, dst=74608145, cmd=1, u1=25.9V, i1=0.02A, p1=0.6W, u2=26.0V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2775: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 a3 00 00 00 05 00 00 00 00 8b 5c e7 - 2776: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 a4 00 00 00 05 00 00 00 00 bb 7a f6 - 2777: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 a5 00 00 00 05 00 00 00 00 2b 77 6a -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 02 00 02 00 06 01 03 00 03 00 07 00 00 94 -2022-03-28T17:43:01.416909Z MSG src=74608145, dst=74608145, cmd=1, u1=25.8V, i1=0.02A, p1=0.6W, u2=25.9V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2778: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 a6 00 00 00 05 00 00 00 00 db 63 8d - 2779: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 a7 00 00 00 05 00 00 00 00 4b 6e 11 - 2780: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 a8 00 00 00 05 00 00 00 00 bb 2f af - 2781: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 a9 00 00 00 05 00 00 00 00 2b 22 33 - 2782: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 aa 00 00 00 05 00 00 00 00 db 36 d4 - 2783: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 ab 00 00 00 05 00 00 00 00 4b 3b 48 - 2784: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 ac 00 00 00 05 00 00 00 00 7b 1d 59 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 01 00 02 00 06 01 01 00 03 00 07 00 00 95 -2022-03-28T17:43:08.446803Z MSG src=74608145, dst=74608145, cmd=1, u1=25.7V, i1=0.02A, p1=0.6W, u2=25.7V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2785: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 ad 00 00 00 05 00 00 00 00 eb 10 c5 - 2786: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 ae 00 00 00 05 00 00 00 00 1b 04 22 - 2787: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 af 00 00 00 05 00 00 00 00 8b 09 be -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 00 00 02 00 06 01 00 00 03 00 07 00 00 95 -2022-03-28T17:43:11.456776Z MSG src=74608145, dst=74608145, cmd=1, u1=25.6V, i1=0.02A, p1=0.6W, u2=25.6V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 28 13 85 00 00 51 -2022-03-28T17:43:11.506420Z MSG src=74608145, dst=74608145, cmd=2, u=234.4V, f=49.97Hz, p=0.0W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 2788: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 b0 00 00 00 05 00 00 00 00 bb 85 1d - 2789: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 b1 00 00 00 05 00 00 00 00 2b 88 81 - 2790: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 b2 00 00 00 05 00 00 00 00 db 9c 66 - 2791: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 b3 00 00 00 05 00 00 00 00 4b 91 fa - 2792: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 b4 00 00 00 05 00 00 00 00 7b b7 eb - 2793: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 b5 00 00 00 05 00 00 00 00 eb ba 77 - 2794: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 b6 00 00 00 05 00 00 00 00 1b ae 90 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 fe 00 02 00 06 00 fe 00 03 00 07 00 00 95 -2022-03-28T17:43:18.486774Z MSG src=74608145, dst=74608145, cmd=1, u1=25.4V, i1=0.02A, p1=0.6W, u2=25.4V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 29 13 84 00 00 51 -2022-03-28T17:43:18.536481Z MSG src=74608145, dst=74608145, cmd=2, u=234.5V, f=49.96Hz, p=0.0W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 2795: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 b7 00 00 00 05 00 00 00 00 8b a3 0c - 2796: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 b8 00 00 00 05 00 00 00 00 7b e2 b2 - 2797: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 b9 00 00 00 05 00 00 00 00 eb ef 2e - 2798: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 ba 00 00 00 05 00 00 00 00 1b fb c9 - 2799: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 bb 00 00 00 05 00 00 00 00 8b f6 55 - 2800: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 bc 00 00 00 05 00 00 00 00 bb d0 44 - 2801: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 bd 00 00 00 05 00 00 00 00 2b dd d8 - 2802: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 be 00 00 00 05 00 00 00 00 db c9 3f - 2803: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 bf 00 00 00 05 00 00 00 00 4b c4 a3 - 2804: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 c0 00 00 00 05 00 00 00 00 79 e0 ca -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 fc 00 02 00 06 00 fc 00 03 00 07 00 00 95 -2022-03-28T17:43:28.526594Z MSG src=74608145, dst=74608145, cmd=1, u1=25.2V, i1=0.02A, p1=0.6W, u2=25.2V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 28 13 84 00 00 50 -2022-03-28T17:43:28.576204Z MSG src=74608145, dst=74608145, cmd=2, u=234.4V, f=49.96Hz, p=0.0W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 2805: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 c1 00 00 00 05 00 00 00 00 e9 ed 56 - 2806: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 c2 00 00 00 05 00 00 00 00 19 f9 b1 - 2807: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 c3 00 00 00 05 00 00 00 00 89 f4 2d - 2808: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 c4 00 00 00 05 00 00 00 00 b9 d2 3c - 2809: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 c5 00 00 00 05 00 00 00 00 29 df a0 - 2810: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 c6 00 00 00 05 00 00 00 00 d9 cb 47 - 2811: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 c7 00 00 00 05 00 00 00 00 49 c6 db - 2812: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 c8 00 00 00 05 00 00 00 00 b9 87 65 - 2813: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 c9 00 00 00 05 00 00 00 00 29 8a f9 - 2814: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 ca 00 00 00 05 00 00 00 00 d9 9e 1e - 2815: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 cb 00 00 00 05 00 00 00 00 49 93 82 - 2816: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 cc 00 00 00 05 00 00 00 00 79 b5 93 - 2817: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 cd 00 00 00 05 00 00 00 00 e9 b8 0f - 2818: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 ce 00 00 00 05 00 00 00 00 19 ac e8 - 2819: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 cf 00 00 00 05 00 00 00 00 89 a1 74 - 2820: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 d0 00 00 00 05 00 00 00 00 b9 2d d7 - 2821: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 d1 00 00 00 05 00 00 00 00 29 20 4b - 2822: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 d2 00 00 00 05 00 00 00 00 d9 34 ac - 2823: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 d3 00 00 00 05 00 00 00 00 49 39 30 - 2824: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 d4 00 00 00 05 00 00 00 00 79 1f 21 - 2825: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 d5 00 00 00 05 00 00 00 00 e9 12 bd - 2826: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 d6 00 00 00 05 00 00 00 00 19 06 5a - 2827: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 d7 00 00 00 05 00 00 00 00 89 0b c6 - 2828: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 d8 00 00 00 05 00 00 00 00 79 4a 78 - 2829: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 d9 00 00 00 05 00 00 00 00 e9 47 e4 - 2830: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 da 00 00 00 05 00 00 00 00 19 53 03 - 2831: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 db 00 00 00 05 00 00 00 00 89 5e 9f - 2832: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 dc 00 00 00 05 00 00 00 00 b9 78 8e - 2833: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 dd 00 00 00 05 00 00 00 00 29 75 12 - 2834: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 de 00 00 00 05 00 00 00 00 d9 61 f5 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 ed 00 03 00 06 00 ee 00 03 00 07 00 00 97 -2022-03-28T17:43:58.640968Z MSG src=74608145, dst=74608145, cmd=1, u1=23.7V, i1=0.03A, p1=0.6W, u2=23.8V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2835: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 df 00 00 00 05 00 00 00 00 49 6c 69 - 2836: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 e0 00 00 00 05 00 00 00 00 b8 79 b2 - 2837: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 e1 00 00 00 05 00 00 00 00 28 74 2e - 2838: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 e2 00 00 00 05 00 00 00 00 d8 60 c9 - 2839: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 e3 00 00 00 05 00 00 00 00 48 6d 55 - 2840: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 e4 00 00 00 05 00 00 00 00 78 4b 44 - 2841: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 e5 00 00 00 05 00 00 00 00 e8 46 d8 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 e9 00 03 00 06 00 e9 00 03 00 07 00 00 94 -2022-03-28T17:44:05.670819Z MSG src=74608145, dst=74608145, cmd=1, u1=23.3V, i1=0.03A, p1=0.6W, u2=23.3V, i2=0.03A, p2=0.7W, unknown1=1, unknown2=0 - 2842: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 e6 00 00 00 05 00 00 00 00 18 52 3f - 2843: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 e7 00 00 00 05 00 00 00 00 88 5f a3 - 2844: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 e8 00 00 00 05 00 00 00 00 78 1e 1d - 2845: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 e9 00 00 00 05 00 00 00 00 e8 13 81 - 2846: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 ea 00 00 00 05 00 00 00 00 18 07 66 - 2847: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 eb 00 00 00 05 00 00 00 00 88 0a fa - 2848: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 ec 00 00 00 05 00 00 00 00 b8 2c eb - 2849: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 ed 00 00 00 05 00 00 00 00 28 21 77 - 2850: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 ee 00 00 00 05 00 00 00 00 d8 35 90 - 2851: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 ef 00 00 00 05 00 00 00 00 48 38 0c -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 e0 00 03 00 06 00 e0 00 03 00 06 00 00 95 -2022-03-28T17:44:15.710544Z MSG src=74608145, dst=74608145, cmd=1, u1=22.4V, i1=0.03A, p1=0.6W, u2=22.4V, i2=0.03A, p2=0.6W, unknown1=1, unknown2=0 - 2852: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 f0 00 00 00 05 00 00 00 00 78 b4 af - 2853: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 f1 00 00 00 05 00 00 00 00 e8 b9 33 - 2854: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 f2 00 00 00 05 00 00 00 00 18 ad d4 - 2855: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 f3 00 00 00 05 00 00 00 00 88 a0 48 - 2856: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 f4 00 00 00 05 00 00 00 00 b8 86 59 - 2857: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 f5 00 00 00 05 00 00 00 00 28 8b c5 - 2858: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 f6 00 00 00 05 00 00 00 00 d8 9f 22 - 2859: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 f7 00 00 00 05 00 00 00 00 48 92 be - 2860: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 f8 00 00 00 05 00 00 00 00 b8 d3 00 - 2861: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 f9 00 00 00 05 00 00 00 00 28 de 9c -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 05 00 02 00 05 01 05 00 02 00 05 00 00 95 -2022-03-28T17:44:25.750225Z MSG src=74608145, dst=74608145, cmd=1, u1=26.1V, i1=0.02A, p1=0.5W, u2=26.1V, i2=0.02A, p2=0.5W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 2b 13 85 00 00 52 -2022-03-28T17:44:25.799874Z MSG src=74608145, dst=74608145, cmd=2, u=234.7V, f=49.97Hz, p=0.0W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 2862: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 fa 00 00 00 05 00 00 00 00 d8 ca 7b - 2863: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 fb 00 00 00 05 00 00 00 00 48 c7 e7 - 2864: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 fc 00 00 00 05 00 00 00 00 78 e1 f6 - 2865: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 fd 00 00 00 05 00 00 00 00 e8 ec 6a - 2866: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 fe 00 00 00 05 00 00 00 00 18 f8 8d - 2867: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f3 ff 00 00 00 05 00 00 00 00 88 f5 11 - 2868: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 00 00 00 00 05 00 00 00 00 a6 01 33 - 2869: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 01 00 00 00 05 00 00 00 00 36 0c af - 2870: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 02 00 00 00 05 00 00 00 00 c6 18 48 - 2871: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 03 00 00 00 05 00 00 00 00 56 15 d4 -Received 27 bytes on pipe 5: 95 74 60 81 45 74 60 81 45 01 00 01 01 0a 00 02 00 04 01 0b 00 02 00 05 00 00 95 -2022-03-28T17:44:35.789920Z MSG src=74608145, dst=74608145, cmd=1, u1=26.6V, i1=0.02A, p1=0.4W, u2=26.7V, i2=0.02A, p2=0.5W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 26 13 84 00 00 5e -2022-03-28T17:44:35.839557Z MSG src=74608145, dst=74608145, cmd=2, u=234.2V, f=49.96Hz, p=0.0W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 2872: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 04 00 00 00 05 00 00 00 00 66 33 c5 - 2873: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 05 00 00 00 05 00 00 00 00 f6 3e 59 - 2874: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 06 00 00 00 05 00 00 00 00 06 2a be - 2875: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 07 00 00 00 05 00 00 00 00 96 27 22 - 2876: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 08 00 00 00 05 00 00 00 00 66 66 9c - 2877: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 09 00 00 00 05 00 00 00 00 f6 6b 00 - 2878: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 0a 00 00 00 05 00 00 00 00 06 7f e7 - 2879: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 0b 00 00 00 05 00 00 00 00 96 72 7b - 2880: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 0c 00 00 00 05 00 00 00 00 a6 54 6a - 2881: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 0d 00 00 00 05 00 00 00 00 36 59 f6 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 09 00 02 00 05 01 09 00 02 00 05 00 00 95 -2022-03-28T17:44:45.829643Z MSG src=74608145, dst=74608145, cmd=1, u1=26.5V, i1=0.02A, p1=0.5W, u2=26.5V, i2=0.02A, p2=0.5W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 29 13 85 00 00 50 -2022-03-28T17:44:45.879229Z MSG src=74608145, dst=74608145, cmd=2, u=234.5V, f=49.97Hz, p=0.0W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 2882: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 0e 00 00 00 05 00 00 00 00 c6 4d 11 - 2883: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 0f 00 00 00 05 00 00 00 00 56 40 8d - 2884: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 10 00 00 00 05 00 00 00 00 66 cc 2e - 2885: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 11 00 00 00 05 00 00 00 00 f6 c1 b2 - 2886: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 12 00 00 00 05 00 00 00 00 06 d5 55 - 2887: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 13 00 00 00 05 00 00 00 00 96 d8 c9 - 2888: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 14 00 00 00 05 00 00 00 00 a6 fe d8 - 2889: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 15 00 00 00 05 00 00 00 00 36 f3 44 - 2890: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 16 00 00 00 05 00 00 00 00 c6 e7 a3 - 2891: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 17 00 00 00 05 00 00 00 00 56 ea 3f - 2892: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 18 00 00 00 05 00 00 00 00 a6 ab 81 - 2893: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 19 00 00 00 05 00 00 00 00 36 a6 1d - 2894: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 1a 00 00 00 05 00 00 00 00 c6 b2 fa - 2895: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 1b 00 00 00 05 00 00 00 00 56 bf 66 - 2896: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 1c 00 00 00 05 00 00 00 00 66 99 77 - 2897: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 1d 00 00 00 05 00 00 00 00 f6 94 eb - 2898: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 1e 00 00 00 05 00 00 00 00 06 80 0c - 2899: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 1f 00 00 00 05 00 00 00 00 96 8d 90 - 2900: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 20 00 00 00 05 00 00 00 00 67 98 4b - 2901: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 21 00 00 00 05 00 00 00 00 f7 95 d7 - 2902: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 22 00 00 00 05 00 00 00 00 07 81 30 - 2903: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 23 00 00 00 05 00 00 00 00 97 8c ac - 2904: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 24 00 00 00 05 00 00 00 00 a7 aa bd - 2905: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 25 00 00 00 05 00 00 00 00 37 a7 21 - 2906: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 26 00 00 00 05 00 00 00 00 c7 b3 c6 - 2907: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 27 00 00 00 05 00 00 00 00 57 be 5a - 2908: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 28 00 00 00 05 00 00 00 00 a7 ff e4 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 06 00 02 00 04 01 07 00 02 00 05 00 00 95 -2022-03-28T17:45:12.933639Z MSG src=74608145, dst=74608145, cmd=1, u1=26.2V, i1=0.02A, p1=0.4W, u2=26.3V, i2=0.02A, p2=0.5W, unknown1=1, unknown2=0 - 2909: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 29 00 00 00 05 00 00 00 00 37 f2 78 - 2910: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 2a 00 00 00 05 00 00 00 00 c7 e6 9f - 2911: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 2b 00 00 00 05 00 00 00 00 57 eb 03 - 2912: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 2c 00 00 00 05 00 00 00 00 67 cd 12 - 2913: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 2d 00 00 00 05 00 00 00 00 f7 c0 8e - 2914: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 2e 00 00 00 05 00 00 00 00 07 d4 69 - 2915: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 2f 00 00 00 05 00 00 00 00 97 d9 f5 - 2916: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 30 00 00 00 05 00 00 00 00 a7 55 56 - 2917: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 31 00 00 00 05 00 00 00 00 37 58 ca - 2918: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 32 00 00 00 05 00 00 00 00 c7 4c 2d -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 05 00 02 00 04 01 06 00 02 00 05 00 00 97 -2022-03-28T17:45:22.973240Z MSG src=74608145, dst=74608145, cmd=1, u1=26.1V, i1=0.02A, p1=0.4W, u2=26.2V, i2=0.02A, p2=0.5W, unknown1=1, unknown2=0 - 2919: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 33 00 00 00 05 00 00 00 00 57 41 b1 - 2920: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 34 00 00 00 05 00 00 00 00 67 67 a0 - 2921: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 35 00 00 00 05 00 00 00 00 f7 6a 3c - 2922: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 36 00 00 00 05 00 00 00 00 07 7e db - 2923: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 37 00 00 00 05 00 00 00 00 97 73 47 - 2924: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 38 00 00 00 05 00 00 00 00 67 32 f9 - 2925: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 39 00 00 00 05 00 00 00 00 f7 3f 65 - 2926: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 3a 00 00 00 05 00 00 00 00 07 2b 82 - 2927: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 3b 00 00 00 05 00 00 00 00 97 26 1e - 2928: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 3c 00 00 00 05 00 00 00 00 a7 00 0f -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 04 00 02 00 04 01 04 00 02 00 05 00 00 94 -2022-03-28T17:45:33.012778Z MSG src=74608145, dst=74608145, cmd=1, u1=26.0V, i1=0.02A, p1=0.4W, u2=26.0V, i2=0.02A, p2=0.5W, unknown1=1, unknown2=0 - 2929: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 3d 00 00 00 05 00 00 00 00 37 0d 93 - 2930: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 3f 00 00 00 05 00 00 00 00 57 14 e8 - 2931: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 40 00 00 00 05 00 00 00 00 65 30 81 - 2932: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 41 00 00 00 05 00 00 00 00 f5 3d 1d - 2933: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 42 00 00 00 05 00 00 00 00 05 29 fa - 2934: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 43 00 00 00 05 00 00 00 00 95 24 66 - 2935: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 44 00 00 00 05 00 00 00 00 a5 02 77 - 2936: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 45 00 00 00 05 00 00 00 00 35 0f eb - 2937: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 46 00 00 00 05 00 00 00 00 c5 1b 0c - 2938: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 47 00 00 00 05 00 00 00 00 55 16 90 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 01 03 00 02 00 04 01 03 00 02 00 05 00 00 94 -2022-03-28T17:45:43.052378Z MSG src=74608145, dst=74608145, cmd=1, u1=25.9V, i1=0.02A, p1=0.4W, u2=25.9V, i2=0.02A, p2=0.5W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 25 13 88 00 00 51 -2022-03-28T17:45:43.102033Z MSG src=74608145, dst=74608145, cmd=2, u=234.1V, f=50.00Hz, p=0.0W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 2939: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 48 00 00 00 05 00 00 00 00 a5 57 2e - 2940: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 49 00 00 00 05 00 00 00 00 35 5a b2 - 2941: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 4a 00 00 00 05 00 00 00 00 c5 4e 55 - 2942: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 4b 00 00 00 05 00 00 00 00 55 43 c9 - 2943: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 4c 00 00 00 05 00 00 00 00 65 65 d8 - 2944: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 4d 00 00 00 05 00 00 00 00 f5 68 44 - 2945: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 4e 00 00 00 05 00 00 00 00 05 7c a3 - 2946: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 4f 00 00 00 05 00 00 00 00 95 71 3f - 2947: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 50 00 00 00 05 00 00 00 00 a5 fd 9c - 2948: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 51 00 00 00 05 00 00 00 00 35 f0 00 - 2949: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 52 00 00 00 05 00 00 00 00 c5 e4 e7 - 2950: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 53 00 00 00 05 00 00 00 00 55 e9 7b - 2951: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 54 00 00 00 05 00 00 00 00 65 cf 6a - 2952: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 55 00 00 00 05 00 00 00 00 f5 c2 f6 - 2953: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 56 00 00 00 05 00 00 00 00 05 d6 11 - 2954: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 57 00 00 00 05 00 00 00 00 95 db 8d - 2955: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 58 00 00 00 05 00 00 00 00 65 9a 33 - 2956: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 59 00 00 00 05 00 00 00 00 f5 97 af - 2957: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 5a 00 00 00 05 00 00 00 00 05 83 48 - 2958: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 5b 00 00 00 05 00 00 00 00 95 8e d4 - 2959: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 5c 00 00 00 05 00 00 00 00 a5 a8 c5 - 2960: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 5d 00 00 00 05 00 00 00 00 35 a5 59 - 2961: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 5e 00 00 00 05 00 00 00 00 c5 b1 be - 2962: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 5f 00 00 00 05 00 00 00 00 55 bc 22 - 2963: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 60 00 00 00 05 00 00 00 00 a4 a9 f9 - 2964: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 61 00 00 00 05 00 00 00 00 34 a4 65 - 2965: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 62 00 00 00 05 00 00 00 00 c4 b0 82 - 2966: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 63 00 00 00 05 00 00 00 00 54 bd 1e - 2967: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 64 00 00 00 05 00 00 00 00 64 9b 0f - 2968: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 65 00 00 00 05 00 00 00 00 f4 96 93 - 2969: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 66 00 00 00 05 00 00 00 00 04 82 74 - 2970: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 67 00 00 00 05 00 00 00 00 94 8f e8 - 2971: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 68 00 00 00 05 00 00 00 00 64 ce 56 - 2972: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 69 00 00 00 05 00 00 00 00 f4 c3 ca - 2973: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 6a 00 00 00 05 00 00 00 00 04 d7 2d - 2974: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 6b 00 00 00 05 00 00 00 00 94 da b1 - 2975: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 6c 00 00 00 05 00 00 00 00 a4 fc a0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 fe 00 02 00 04 00 fe 00 02 00 05 00 00 94 -2022-03-28T17:46:20.195631Z MSG src=74608145, dst=74608145, cmd=1, u1=25.4V, i1=0.02A, p1=0.4W, u2=25.4V, i2=0.02A, p2=0.5W, unknown1=1, unknown2=0 - 2976: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 6d 00 00 00 05 00 00 00 00 34 f1 3c - 2977: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 6e 00 00 00 05 00 00 00 00 c4 e5 db - 2978: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 6f 00 00 00 05 00 00 00 00 54 e8 47 - 2979: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 70 00 00 00 05 00 00 00 00 64 64 e4 - 2980: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 71 00 00 00 05 00 00 00 00 f4 69 78 - 2981: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 72 00 00 00 05 00 00 00 00 04 7d 9f - 2982: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 73 00 00 00 05 00 00 00 00 94 70 03 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 fd 00 02 00 04 00 fd 00 02 00 05 00 00 94 -2022-03-28T17:46:27.225286Z MSG src=74608145, dst=74608145, cmd=1, u1=25.3V, i1=0.02A, p1=0.4W, u2=25.3V, i2=0.02A, p2=0.5W, unknown1=1, unknown2=0 - 2983: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 74 00 00 00 05 00 00 00 00 a4 56 12 - 2984: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 75 00 00 00 05 00 00 00 00 34 5b 8e - 2985: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 76 00 00 00 05 00 00 00 00 c4 4f 69 - 2986: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 77 00 00 00 05 00 00 00 00 54 42 f5 - 2987: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 78 00 00 00 05 00 00 00 00 a4 03 4b - 2988: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 79 00 00 00 05 00 00 00 00 34 0e d7 - 2989: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 7a 00 00 00 05 00 00 00 00 c4 1a 30 - 2990: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 7b 00 00 00 05 00 00 00 00 54 17 ac - 2991: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 7c 00 00 00 05 00 00 00 00 64 31 bd - 2992: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 7d 00 00 00 05 00 00 00 00 f4 3c 21 - 2993: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 7e 00 00 00 05 00 00 00 00 04 28 c6 - 2994: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 7f 00 00 00 05 00 00 00 00 94 25 5a - 2995: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 80 00 00 00 05 00 00 00 00 60 60 14 - 2996: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 81 00 00 00 05 00 00 00 00 f0 6d 88 - 2997: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 82 00 00 00 05 00 00 00 00 00 79 6f - 2998: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 83 00 00 00 05 00 00 00 00 90 74 f3 - 2999: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 84 00 00 00 05 00 00 00 00 a0 52 e2 - 3000: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 85 00 00 00 05 00 00 00 00 30 5f 7e - 3001: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 86 00 00 00 05 00 00 00 00 c0 4b 99 - 3002: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 87 00 00 00 05 00 00 00 00 50 46 05 - 3003: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 88 00 00 00 05 00 00 00 00 a0 07 bb - 3004: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 89 00 00 00 05 00 00 00 00 30 0a 27 - 3005: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 8a 00 00 00 05 00 00 00 00 c0 1e c0 - 3006: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 8b 00 00 00 05 00 00 00 00 50 13 5c - 3007: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 8c 00 00 00 05 00 00 00 00 60 35 4d - 3008: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 8d 00 00 00 05 00 00 00 00 f0 38 d1 - 3009: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 8e 00 00 00 05 00 00 00 00 00 2c 36 - 3010: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 8f 00 00 00 05 00 00 00 00 90 21 aa - 3011: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 90 00 00 00 05 00 00 00 00 a0 ad 09 - 3012: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 91 00 00 00 05 00 00 00 00 30 a0 95 - 3013: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 92 00 00 00 05 00 00 00 00 c0 b4 72 - 3014: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 93 00 00 00 05 00 00 00 00 50 b9 ee - 3015: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 94 00 00 00 05 00 00 00 00 60 9f ff - 3016: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 95 00 00 00 05 00 00 00 00 f0 92 63 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 f6 00 02 00 04 00 f7 00 02 00 05 00 00 95 -2022-03-28T17:47:01.360336Z MSG src=74608145, dst=74608145, cmd=1, u1=24.6V, i1=0.02A, p1=0.4W, u2=24.7V, i2=0.02A, p2=0.5W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 23 13 89 00 00 56 -2022-03-28T17:47:01.409946Z MSG src=74608145, dst=74608145, cmd=2, u=233.9V, f=50.01Hz, p=0.0W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 3017: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 96 00 00 00 05 00 00 00 00 00 86 84 - 3018: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 97 00 00 00 05 00 00 00 00 90 8b 18 - 3019: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 98 00 00 00 05 00 00 00 00 60 ca a6 - 3020: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 99 00 00 00 05 00 00 00 00 f0 c7 3a - 3021: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 9a 00 00 00 05 00 00 00 00 00 d3 dd - 3022: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 9b 00 00 00 05 00 00 00 00 90 de 41 - 3023: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 9c 00 00 00 05 00 00 00 00 a0 f8 50 - 3024: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 9d 00 00 00 05 00 00 00 00 30 f5 cc - 3025: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 9e 00 00 00 05 00 00 00 00 c0 e1 2b - 3026: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 9f 00 00 00 05 00 00 00 00 50 ec b7 - 3027: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 a0 00 00 00 05 00 00 00 00 a1 f9 6c - 3028: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 a1 00 00 00 05 00 00 00 00 31 f4 f0 - 3029: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 a2 00 00 00 05 00 00 00 00 c1 e0 17 - 3030: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 a3 00 00 00 05 00 00 00 00 51 ed 8b - 3031: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 a4 00 00 00 05 00 00 00 00 61 cb 9a - 3032: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 a5 00 00 00 05 00 00 00 00 f1 c6 06 - 3033: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 a6 00 00 00 05 00 00 00 00 01 d2 e1 - 3034: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 a7 00 00 00 05 00 00 00 00 91 df 7d - 3035: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 a8 00 00 00 05 00 00 00 00 61 9e c3 - 3036: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 a9 00 00 00 05 00 00 00 00 f1 93 5f - 3037: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 aa 00 00 00 05 00 00 00 00 01 87 b8 - 3038: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 ab 00 00 00 05 00 00 00 00 91 8a 24 - 3039: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 ac 00 00 00 05 00 00 00 00 a1 ac 35 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 f1 00 02 00 04 00 f1 00 02 00 04 00 00 95 -2022-03-28T17:47:24.450179Z MSG src=74608145, dst=74608145, cmd=1, u1=24.1V, i1=0.02A, p1=0.4W, u2=24.1V, i2=0.02A, p2=0.4W, unknown1=1, unknown2=0 - 3040: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 ad 00 00 00 05 00 00 00 00 31 a1 a9 - 3041: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 ae 00 00 00 05 00 00 00 00 c1 b5 4e - 3042: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 af 00 00 00 05 00 00 00 00 51 b8 d2 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 f0 00 02 00 04 00 f1 00 02 00 04 00 00 94 -2022-03-28T17:47:27.460519Z MSG src=74608145, dst=74608145, cmd=1, u1=24.0V, i1=0.02A, p1=0.4W, u2=24.1V, i2=0.02A, p2=0.4W, unknown1=1, unknown2=0 - 3043: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 b0 00 00 00 05 00 00 00 00 61 34 71 - 3044: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 b1 00 00 00 05 00 00 00 00 f1 39 ed - 3045: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 b2 00 00 00 05 00 00 00 00 01 2d 0a - 3046: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 b3 00 00 00 05 00 00 00 00 91 20 96 - 3047: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 b4 00 00 00 05 00 00 00 00 a1 06 87 - 3048: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 b5 00 00 00 05 00 00 00 00 31 0b 1b - 3049: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 b6 00 00 00 05 00 00 00 00 c1 1f fc - 3050: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 b7 00 00 00 05 00 00 00 00 51 12 60 - 3051: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 b8 00 00 00 05 00 00 00 00 a1 53 de - 3052: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 b9 00 00 00 05 00 00 00 00 31 5e 42 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 ee 00 02 00 04 00 ee 00 02 00 05 00 00 94 -2022-03-28T17:47:37.501722Z MSG src=74608145, dst=74608145, cmd=1, u1=23.8V, i1=0.02A, p1=0.4W, u2=23.8V, i2=0.02A, p2=0.5W, unknown1=1, unknown2=0 - 3053: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 ba 00 00 00 05 00 00 00 00 c1 4a a5 - 3054: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 bb 00 00 00 05 00 00 00 00 51 47 39 - 3055: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 bc 00 00 00 05 00 00 00 00 61 61 28 - 3056: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 bd 00 00 00 05 00 00 00 00 f1 6c b4 - 3057: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 be 00 00 00 05 00 00 00 00 01 78 53 - 3058: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 bf 00 00 00 05 00 00 00 00 91 75 cf - 3059: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 c0 00 00 00 05 00 00 00 00 a3 51 a6 - 3060: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 c1 00 00 00 05 00 00 00 00 33 5c 3a - 3061: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 c2 00 00 00 05 00 00 00 00 c3 48 dd - 3062: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 c3 00 00 00 05 00 00 00 00 53 45 41 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 eb 00 02 00 04 00 eb 00 02 00 04 00 00 95 -2022-03-28T17:47:47.542214Z MSG src=74608145, dst=74608145, cmd=1, u1=23.5V, i1=0.02A, p1=0.4W, u2=23.5V, i2=0.02A, p2=0.4W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 23 13 89 00 00 56 -2022-03-28T17:47:47.591836Z MSG src=74608145, dst=74608145, cmd=2, u=233.9V, f=50.01Hz, p=0.0W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 3063: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 c4 00 00 00 05 00 00 00 00 63 63 50 - 3064: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 c5 00 00 00 05 00 00 00 00 f3 6e cc - 3065: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 c6 00 00 00 05 00 00 00 00 03 7a 2b - 3066: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 c7 00 00 00 05 00 00 00 00 93 77 b7 - 3067: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 c8 00 00 00 05 00 00 00 00 63 36 09 - 3068: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 c9 00 00 00 05 00 00 00 00 f3 3b 95 - 3069: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 ca 00 00 00 05 00 00 00 00 03 2f 72 - 3070: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 cb 00 00 00 05 00 00 00 00 93 22 ee - 3071: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 cc 00 00 00 05 00 00 00 00 a3 04 ff - 3072: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 cd 00 00 00 05 00 00 00 00 33 09 63 - 3073: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 ce 00 00 00 05 00 00 00 00 c3 1d 84 - 3074: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 cf 00 00 00 05 00 00 00 00 53 10 18 - 3075: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 d0 00 00 00 05 00 00 00 00 63 9c bb -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 e5 00 02 00 04 00 e6 00 02 00 04 00 00 96 -2022-03-28T17:48:00.592818Z MSG src=74608145, dst=74608145, cmd=1, u1=22.9V, i1=0.02A, p1=0.4W, u2=23.0V, i2=0.02A, p2=0.4W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 23 13 88 00 00 57 -2022-03-28T17:48:00.642487Z MSG src=74608145, dst=74608145, cmd=2, u=233.9V, f=50.00Hz, p=0.0W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 3076: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 d1 00 00 00 05 00 00 00 00 f3 91 27 - 3077: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 d2 00 00 00 05 00 00 00 00 03 85 c0 - 3078: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 d3 00 00 00 05 00 00 00 00 93 88 5c - 3079: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 d4 00 00 00 05 00 00 00 00 a3 ae 4d - 3080: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 d5 00 00 00 05 00 00 00 00 33 a3 d1 - 3081: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 d6 00 00 00 05 00 00 00 00 c3 b7 36 - 3082: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 d7 00 00 00 05 00 00 00 00 53 ba aa - 3083: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 d8 00 00 00 05 00 00 00 00 a3 fb 14 - 3084: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 d9 00 00 00 05 00 00 00 00 33 f6 88 - 3085: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 da 00 00 00 05 00 00 00 00 c3 e2 6f -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 e0 00 02 00 04 00 e0 00 02 00 04 00 00 95 -2022-03-28T17:48:10.628489Z MSG src=74608145, dst=74608145, cmd=1, u1=22.4V, i1=0.02A, p1=0.4W, u2=22.4V, i2=0.02A, p2=0.4W, unknown1=1, unknown2=0 - 3086: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 db 00 00 00 05 00 00 00 00 53 ef f3 - 3087: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 dc 00 00 00 05 00 00 00 00 63 c9 e2 - 3088: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 dd 00 00 00 05 00 00 00 00 f3 c4 7e - 3089: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 de 00 00 00 05 00 00 00 00 03 d0 99 - 3090: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 df 00 00 00 05 00 00 00 00 93 dd 05 - 3091: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 e0 00 00 00 05 00 00 00 00 62 c8 de - 3092: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 e1 00 00 00 05 00 00 00 00 f2 c5 42 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 dc 00 02 00 04 00 dc 00 02 00 04 00 00 95 -2022-03-28T17:48:17.658887Z MSG src=74608145, dst=74608145, cmd=1, u1=22.0V, i1=0.02A, p1=0.4W, u2=22.0V, i2=0.02A, p2=0.4W, unknown1=1, unknown2=0 - 3093: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 e2 00 00 00 05 00 00 00 00 02 d1 a5 - 3094: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 e3 00 00 00 05 00 00 00 00 92 dc 39 - 3095: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 e4 00 00 00 05 00 00 00 00 a2 fa 28 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 da 00 02 00 04 00 da 00 02 00 04 00 00 95 -2022-03-28T17:48:20.669063Z MSG src=74608145, dst=74608145, cmd=1, u1=21.8V, i1=0.02A, p1=0.4W, u2=21.8V, i2=0.02A, p2=0.4W, unknown1=1, unknown2=0 - 3096: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 e5 00 00 00 05 00 00 00 00 32 f7 b4 - 3097: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 e6 00 00 00 05 00 00 00 00 c2 e3 53 - 3098: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 e7 00 00 00 05 00 00 00 00 52 ee cf - 3099: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 e8 00 00 00 05 00 00 00 00 a2 af 71 - 3100: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 e9 00 00 00 05 00 00 00 00 32 a2 ed - 3101: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 ea 00 00 00 05 00 00 00 00 c2 b6 0a - 3102: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 eb 00 00 00 05 00 00 00 00 52 bb 96 - 3103: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 ec 00 00 00 05 00 00 00 00 62 9d 87 - 3104: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 ed 00 00 00 05 00 00 00 00 f2 90 1b - 3105: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 ee 00 00 00 05 00 00 00 00 02 84 fc -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 d0 00 02 00 04 00 d0 00 02 00 04 00 00 95 -2022-03-28T17:48:30.709791Z MSG src=74608145, dst=74608145, cmd=1, u1=20.8V, i1=0.02A, p1=0.4W, u2=20.8V, i2=0.02A, p2=0.4W, unknown1=1, unknown2=0 - 3106: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 ef 00 00 00 05 00 00 00 00 92 89 60 - 3107: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 f0 00 00 00 05 00 00 00 00 a2 05 c3 - 3108: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 f1 00 00 00 05 00 00 00 00 32 08 5f - 3109: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 f2 00 00 00 05 00 00 00 00 c2 1c b8 - 3110: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 f3 00 00 00 05 00 00 00 00 52 11 24 - 3111: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 f4 00 00 00 05 00 00 00 00 62 37 35 - 3112: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 f5 00 00 00 05 00 00 00 00 f2 3a a9 - 3113: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 f6 00 00 00 05 00 00 00 00 02 2e 4e - 3114: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 f7 00 00 00 05 00 00 00 00 92 23 d2 - 3115: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 f8 00 00 00 05 00 00 00 00 62 62 6c -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 01 00 01 00 c0 00 02 00 04 00 c0 00 02 00 04 00 00 95 -2022-03-28T17:48:40.750532Z MSG src=74608145, dst=74608145, cmd=1, u1=19.2V, i1=0.02A, p1=0.4W, u2=19.2V, i2=0.02A, p2=0.4W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 5: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 2a 13 87 00 00 51 -2022-03-28T17:48:40.800115Z MSG src=74608145, dst=74608145, cmd=2, u=234.6V, f=49.99Hz, p=0.0W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 3116: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 f9 00 00 00 05 00 00 00 00 f2 6f f0 - 3117: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 fa 00 00 00 05 00 00 00 00 02 7b 17 - 3118: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 fb 00 00 00 05 00 00 00 00 92 76 8b - 3119: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 fc 00 00 00 05 00 00 00 00 a2 50 9a - 3120: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 fd 00 00 00 05 00 00 00 00 32 5d 06 - 3121: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 fe 00 00 00 05 00 00 00 00 c2 49 e1 - 3122: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f4 ff 00 00 00 05 00 00 00 00 52 44 7d - 3123: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 00 00 00 00 05 00 00 00 00 63 50 a6 - 3124: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 01 00 00 00 05 00 00 00 00 f3 5d 3a - 3125: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 02 00 00 00 05 00 00 00 00 03 49 dd - 3126: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 03 00 00 00 05 00 00 00 00 93 44 41 - 3127: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 04 00 00 00 05 00 00 00 00 a3 62 50 - 3128: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 05 00 00 00 05 00 00 00 00 33 6f cc -Received 27 bytes on pipe 5: 95 74 60 81 45 74 60 81 45 01 00 01 00 8a 00 02 00 03 00 8a 00 02 00 03 00 00 95 -2022-03-28T17:48:53.801399Z MSG src=74608145, dst=74608145, cmd=1, u1=13.8V, i1=0.02A, p1=0.3W, u2=13.8V, i2=0.02A, p2=0.3W, unknown1=1, unknown2=0 -Received 27 bytes on pipe 1: 95 74 60 81 45 74 60 81 45 02 32 33 00 00 37 bb 06 7f 06 83 09 29 13 87 00 00 52 -2022-03-28T17:48:53.851091Z MSG src=74608145, dst=74608145, cmd=2, u=234.5V, f=49.99Hz, p=0.0W, uk1=12851, uk2=0, uk3=14267, uk4=1663, uk5=1667 - 3129: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 06 00 00 00 05 00 00 00 00 c3 7b 2b - 3130: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 07 00 00 00 05 00 00 00 00 53 76 b7 - 3131: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 08 00 00 00 05 00 00 00 00 a3 37 09 - 3132: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 09 00 00 00 05 00 00 00 00 33 3a 95 - 3133: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 0a 00 00 00 05 00 00 00 00 c3 2e 72 - 3134: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 0b 00 00 00 05 00 00 00 00 53 23 ee - 3135: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 0c 00 00 00 05 00 00 00 00 63 05 ff - 3136: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 0d 00 00 00 05 00 00 00 00 f3 08 63 - 3137: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 0e 00 00 00 05 00 00 00 00 03 1c 84 - 3138: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 0f 00 00 00 05 00 00 00 00 93 11 18 - 3139: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 10 00 00 00 05 00 00 00 00 a3 9d bb - 3140: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 11 00 00 00 05 00 00 00 00 33 90 27 - 3141: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 12 00 00 00 05 00 00 00 00 c3 84 c0 - 3142: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 13 00 00 00 05 00 00 00 00 53 89 5c - 3143: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 14 00 00 00 05 00 00 00 00 63 af 4d - 3144: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 15 00 00 00 05 00 00 00 00 f3 a2 d1 - 3145: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 16 00 00 00 05 00 00 00 00 03 b6 36 - 3146: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 17 00 00 00 05 00 00 00 00 93 bb aa - 3147: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 18 00 00 00 05 00 00 00 00 63 fa 14 - 3148: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 19 00 00 00 05 00 00 00 00 f3 f7 88 - 3149: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 1a 00 00 00 05 00 00 00 00 03 e3 6f - 3150: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 1b 00 00 00 05 00 00 00 00 93 ee f3 - 3151: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 1c 00 00 00 05 00 00 00 00 a3 c8 e2 - 3152: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 1d 00 00 00 05 00 00 00 00 33 c5 7e - 3153: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 1e 00 00 00 05 00 00 00 00 c3 d1 99 - 3154: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 1f 00 00 00 05 00 00 00 00 53 dc 05 - 3155: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 20 00 00 00 05 00 00 00 00 a2 c9 de - 3156: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 21 00 00 00 05 00 00 00 00 32 c4 42 - 3157: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 22 00 00 00 05 00 00 00 00 c2 d0 a5 - 3158: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 23 00 00 00 05 00 00 00 00 52 dd 39 - 3159: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 24 00 00 00 05 00 00 00 00 62 fb 28 - 3160: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 25 00 00 00 05 00 00 00 00 f2 f6 b4 - 3161: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 26 00 00 00 05 00 00 00 00 02 e2 53 - 3162: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 27 00 00 00 05 00 00 00 00 92 ef cf - 3163: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 28 00 00 00 05 00 00 00 00 62 ae 71 - 3164: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 29 00 00 00 05 00 00 00 00 f2 a3 ed - 3165: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 2a 00 00 00 05 00 00 00 00 02 b7 0a - 3166: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 2b 00 00 00 05 00 00 00 00 92 ba 96 - 3167: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 2c 00 00 00 05 00 00 00 00 a2 9c 87 - 3168: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 2d 00 00 00 05 00 00 00 00 32 91 1b - 3169: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 2e 00 00 00 05 00 00 00 00 c2 85 fc - 3170: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 2f 00 00 00 05 00 00 00 00 52 88 60 - 3171: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 30 00 00 00 05 00 00 00 00 62 04 c3 - 3172: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 31 00 00 00 05 00 00 00 00 f2 09 5f - 3173: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 32 00 00 00 05 00 00 00 00 02 1d b8 - 3174: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 33 00 00 00 05 00 00 00 00 92 10 24 - 3175: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 34 00 00 00 05 00 00 00 00 a2 36 35 - 3176: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 35 00 00 00 05 00 00 00 00 32 3b a9 - 3177: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 36 00 00 00 05 00 00 00 00 c2 2f 4e - 3178: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 37 00 00 00 05 00 00 00 00 52 22 d2 - 3179: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 38 00 00 00 05 00 00 00 00 a2 63 6c - 3180: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 39 00 00 00 05 00 00 00 00 32 6e f0 - 3181: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 3a 00 00 00 05 00 00 00 00 c2 7a 17 - 3182: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 3b 00 00 00 05 00 00 00 00 52 77 8b - 3183: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 3c 00 00 00 05 00 00 00 00 62 51 9a - 3184: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 3e 00 00 00 05 00 00 00 00 02 48 e1 - 3185: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 3f 00 00 00 05 00 00 00 00 92 45 7d - 3186: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 40 00 00 00 05 00 00 00 00 a0 61 14 - 3187: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 41 00 00 00 05 00 00 00 00 30 6c 88 - 3188: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 42 00 00 00 05 00 00 00 00 c0 78 6f - 3189: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 43 00 00 00 05 00 00 00 00 50 75 f3 - 3190: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 44 00 00 00 05 00 00 00 00 60 53 e2 - 3191: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 45 00 00 00 05 00 00 00 00 f0 5e 7e - 3192: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 46 00 00 00 05 00 00 00 00 00 4a 99 - 3193: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 47 00 00 00 05 00 00 00 00 90 47 05 - 3194: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 48 00 00 00 05 00 00 00 00 60 06 bb - 3195: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 49 00 00 00 05 00 00 00 00 f0 0b 27 - 3196: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 4a 00 00 00 05 00 00 00 00 00 1f c0 - 3197: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 4b 00 00 00 05 00 00 00 00 90 12 5c - 3198: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 4c 00 00 00 05 00 00 00 00 a0 34 4d - 3199: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 4d 00 00 00 05 00 00 00 00 30 39 d1 - 3200: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 4e 00 00 00 05 00 00 00 00 c0 2d 36 - 3201: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 4f 00 00 00 05 00 00 00 00 50 20 aa - 3202: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 50 00 00 00 05 00 00 00 00 60 ac 09 - 3203: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 51 00 00 00 05 00 00 00 00 f0 a1 95 - 3204: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 52 00 00 00 05 00 00 00 00 00 b5 72 - 3205: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 53 00 00 00 05 00 00 00 00 90 b8 ee - 3206: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 54 00 00 00 05 00 00 00 00 a0 9e ff - 3207: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 55 00 00 00 05 00 00 00 00 30 93 63 - 3208: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 56 00 00 00 05 00 00 00 00 c0 87 84 - 3209: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 57 00 00 00 05 00 00 00 00 50 8a 18 - 3210: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 58 00 00 00 05 00 00 00 00 a0 cb a6 - 3211: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 59 00 00 00 05 00 00 00 00 30 c6 3a - 3212: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 5a 00 00 00 05 00 00 00 00 c0 d2 dd - 3213: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 5b 00 00 00 05 00 00 00 00 50 df 41 - 3214: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 5c 00 00 00 05 00 00 00 00 60 f9 50 - 3215: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 5d 00 00 00 05 00 00 00 00 f0 f4 cc - 3216: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 5e 00 00 00 05 00 00 00 00 00 e0 2b - 3217: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 5f 00 00 00 05 00 00 00 00 90 ed b7 - 3218: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 60 00 00 00 05 00 00 00 00 61 f8 6c - 3219: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 61 00 00 00 05 00 00 00 00 f1 f5 f0 - 3220: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 62 00 00 00 05 00 00 00 00 01 e1 17 - 3221: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 63 00 00 00 05 00 00 00 00 91 ec 8b - 3222: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 64 00 00 00 05 00 00 00 00 a1 ca 9a - 3223: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 65 00 00 00 05 00 00 00 00 31 c7 06 - 3224: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 66 00 00 00 05 00 00 00 00 c1 d3 e1 - 3225: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 67 00 00 00 05 00 00 00 00 51 de 7d - 3226: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 68 00 00 00 05 00 00 00 00 a1 9f c3 - 3227: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 69 00 00 00 05 00 00 00 00 31 92 5f - 3228: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 6a 00 00 00 05 00 00 00 00 c1 86 b8 - 3229: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 6b 00 00 00 05 00 00 00 00 51 8b 24 - 3230: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 6c 00 00 00 05 00 00 00 00 61 ad 35 - 3231: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 6d 00 00 00 05 00 00 00 00 f1 a0 a9 - 3232: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 6e 00 00 00 05 00 00 00 00 01 b4 4e - 3233: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 6f 00 00 00 05 00 00 00 00 91 b9 d2 - 3234: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 70 00 00 00 05 00 00 00 00 a1 35 71 - 3235: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 71 00 00 00 05 00 00 00 00 31 38 ed - 3236: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 72 00 00 00 05 00 00 00 00 c1 2c 0a - 3237: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 73 00 00 00 05 00 00 00 00 51 21 96 - 3238: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 74 00 00 00 05 00 00 00 00 61 07 87 - 3239: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 75 00 00 00 05 00 00 00 00 f1 0a 1b - 3240: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 76 00 00 00 05 00 00 00 00 01 1e fc - 3241: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 77 00 00 00 05 00 00 00 00 91 13 60 - 3242: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 78 00 00 00 05 00 00 00 00 61 52 de - 3243: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 79 00 00 00 05 00 00 00 00 f1 5f 42 - 3244: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 7a 00 00 00 05 00 00 00 00 01 4b a5 - 3245: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 7b 00 00 00 05 00 00 00 00 91 46 39 - 3246: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 7c 00 00 00 05 00 00 00 00 a1 60 28 - 3247: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 7d 00 00 00 05 00 00 00 00 31 6d b4 - 3248: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 7e 00 00 00 05 00 00 00 00 c1 79 53 - 3249: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 7f 00 00 00 05 00 00 00 00 51 74 cf - 3250: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 80 00 00 00 05 00 00 00 00 a5 31 81 - 3251: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 81 00 00 00 05 00 00 00 00 35 3c 1d - 3252: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 82 00 00 00 05 00 00 00 00 c5 28 fa - 3253: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 83 00 00 00 05 00 00 00 00 55 25 66 - 3254: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 84 00 00 00 05 00 00 00 00 65 03 77 - 3255: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 85 00 00 00 05 00 00 00 00 f5 0e eb - 3256: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 86 00 00 00 05 00 00 00 00 05 1a 0c - 3257: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 87 00 00 00 05 00 00 00 00 95 17 90 - 3258: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 88 00 00 00 05 00 00 00 00 65 56 2e - 3259: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 89 00 00 00 05 00 00 00 00 f5 5b b2 - 3260: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 8a 00 00 00 05 00 00 00 00 05 4f 55 - 3261: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 8b 00 00 00 05 00 00 00 00 95 42 c9 - 3262: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 8c 00 00 00 05 00 00 00 00 a5 64 d8 - 3263: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 8d 00 00 00 05 00 00 00 00 35 69 44 - 3264: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 8e 00 00 00 05 00 00 00 00 c5 7d a3 - 3265: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 8f 00 00 00 05 00 00 00 00 55 70 3f - 3266: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 90 00 00 00 05 00 00 00 00 65 fc 9c - 3267: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 91 00 00 00 05 00 00 00 00 f5 f1 00 - 3268: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 92 00 00 00 05 00 00 00 00 05 e5 e7 - 3269: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 93 00 00 00 05 00 00 00 00 95 e8 7b - 3270: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 94 00 00 00 05 00 00 00 00 a5 ce 6a - 3271: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 95 00 00 00 05 00 00 00 00 35 c3 f6 - 3272: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 96 00 00 00 05 00 00 00 00 c5 d7 11 - 3273: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 97 00 00 00 05 00 00 00 00 55 da 8d - 3274: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 98 00 00 00 05 00 00 00 00 a5 9b 33 - 3275: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 99 00 00 00 05 00 00 00 00 35 96 af - 3276: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 9a 00 00 00 05 00 00 00 00 c5 82 48 - 3277: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 9b 00 00 00 05 00 00 00 00 55 8f d4 - 3278: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 9c 00 00 00 05 00 00 00 00 65 a9 c5 - 3279: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 9d 00 00 00 05 00 00 00 00 f5 a4 59 - 3280: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 9e 00 00 00 05 00 00 00 00 05 b0 be - 3281: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 9f 00 00 00 05 00 00 00 00 95 bd 22 - 3282: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 a0 00 00 00 05 00 00 00 00 64 a8 f9 - 3283: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 a1 00 00 00 05 00 00 00 00 f4 a5 65 - 3284: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 a2 00 00 00 05 00 00 00 00 04 b1 82 - 3285: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 a3 00 00 00 05 00 00 00 00 94 bc 1e - 3286: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 a4 00 00 00 05 00 00 00 00 a4 9a 0f - 3287: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 a5 00 00 00 05 00 00 00 00 34 97 93 - 3288: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 a6 00 00 00 05 00 00 00 00 c4 83 74 - 3289: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 a7 00 00 00 05 00 00 00 00 54 8e e8 - 3290: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 a8 00 00 00 05 00 00 00 00 a4 cf 56 - 3291: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 a9 00 00 00 05 00 00 00 00 34 c2 ca - 3292: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 aa 00 00 00 05 00 00 00 00 c4 d6 2d - 3293: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 ab 00 00 00 05 00 00 00 00 54 db b1 - 3294: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 ac 00 00 00 05 00 00 00 00 64 fd a0 - 3295: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 ad 00 00 00 05 00 00 00 00 f4 f0 3c - 3296: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 ae 00 00 00 05 00 00 00 00 04 e4 db - 3297: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 af 00 00 00 05 00 00 00 00 94 e9 47 - 3298: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 b0 00 00 00 05 00 00 00 00 a4 65 e4 - 3299: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 b1 00 00 00 05 00 00 00 00 34 68 78 - 3300: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 b2 00 00 00 05 00 00 00 00 c4 7c 9f - 3301: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 b3 00 00 00 05 00 00 00 00 54 71 03 - 3302: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 b4 00 00 00 05 00 00 00 00 64 57 12 - 3303: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 b5 00 00 00 05 00 00 00 00 f4 5a 8e - 3304: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 b6 00 00 00 05 00 00 00 00 04 4e 69 - 3305: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 b7 00 00 00 05 00 00 00 00 94 43 f5 - 3306: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 b8 00 00 00 05 00 00 00 00 64 02 4b - 3307: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 b9 00 00 00 05 00 00 00 00 f4 0f d7 - 3308: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 ba 00 00 00 05 00 00 00 00 04 1b 30 - 3309: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 bb 00 00 00 05 00 00 00 00 94 16 ac - 3310: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 bc 00 00 00 05 00 00 00 00 a4 30 bd - 3311: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 bd 00 00 00 05 00 00 00 00 34 3d 21 - 3312: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 be 00 00 00 05 00 00 00 00 c4 29 c6 - 3313: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 bf 00 00 00 05 00 00 00 00 54 24 5a - 3314: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 c0 00 00 00 05 00 00 00 00 66 00 33 - 3315: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 c1 00 00 00 05 00 00 00 00 f6 0d af - 3316: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 c2 00 00 00 05 00 00 00 00 06 19 48 - 3317: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 c3 00 00 00 05 00 00 00 00 96 14 d4 - 3318: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 c4 00 00 00 05 00 00 00 00 a6 32 c5 - 3319: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 c5 00 00 00 05 00 00 00 00 36 3f 59 - 3320: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 c6 00 00 00 05 00 00 00 00 c6 2b be - 3321: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 c7 00 00 00 05 00 00 00 00 56 26 22 - 3322: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 c8 00 00 00 05 00 00 00 00 a6 67 9c - 3323: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 c9 00 00 00 05 00 00 00 00 36 6a 00 - 3324: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 ca 00 00 00 05 00 00 00 00 c6 7e e7 - 3325: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 cb 00 00 00 05 00 00 00 00 56 73 7b - 3326: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 cc 00 00 00 05 00 00 00 00 66 55 6a - 3327: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 cd 00 00 00 05 00 00 00 00 f6 58 f6 - 3328: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 ce 00 00 00 05 00 00 00 00 06 4c 11 - 3329: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 cf 00 00 00 05 00 00 00 00 96 41 8d - 3330: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 d0 00 00 00 05 00 00 00 00 a6 cd 2e - 3331: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 d1 00 00 00 05 00 00 00 00 36 c0 b2 - 3332: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 d2 00 00 00 05 00 00 00 00 c6 d4 55 - 3333: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 d3 00 00 00 05 00 00 00 00 56 d9 c9 - 3334: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 d4 00 00 00 05 00 00 00 00 66 ff d8 - 3335: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 d5 00 00 00 05 00 00 00 00 f6 f2 44 - 3336: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 d6 00 00 00 05 00 00 00 00 06 e6 a3 - 3337: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 d7 00 00 00 05 00 00 00 00 96 eb 3f - 3338: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 d8 00 00 00 05 00 00 00 00 66 aa 81 - 3339: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 d9 00 00 00 05 00 00 00 00 f6 a7 1d - 3340: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 da 00 00 00 05 00 00 00 00 06 b3 fa - 3341: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 db 00 00 00 05 00 00 00 00 96 be 66 - 3342: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 dc 00 00 00 05 00 00 00 00 a6 98 77 - 3343: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 dd 00 00 00 05 00 00 00 00 36 95 eb - 3344: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 de 00 00 00 05 00 00 00 00 c6 81 0c - 3345: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 df 00 00 00 05 00 00 00 00 56 8c 90 - 3346: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 e0 00 00 00 05 00 00 00 00 a7 99 4b - 3347: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 e1 00 00 00 05 00 00 00 00 37 94 d7 - 3348: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 e2 00 00 00 05 00 00 00 00 c7 80 30 - 3349: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 e3 00 00 00 05 00 00 00 00 57 8d ac - 3350: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 e4 00 00 00 05 00 00 00 00 67 ab bd - 3351: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 e5 00 00 00 05 00 00 00 00 f7 a6 21 - 3352: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 e6 00 00 00 05 00 00 00 00 07 b2 c6 - 3353: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 e7 00 00 00 05 00 00 00 00 97 bf 5a - 3354: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 e8 00 00 00 05 00 00 00 00 67 fe e4 - 3355: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 e9 00 00 00 05 00 00 00 00 f7 f3 78 - 3356: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 ea 00 00 00 05 00 00 00 00 07 e7 9f - 3357: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 eb 00 00 00 05 00 00 00 00 97 ea 03 - 3358: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 ec 00 00 00 05 00 00 00 00 a7 cc 12 - 3359: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 ed 00 00 00 05 00 00 00 00 37 c1 8e - 3360: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 ee 00 00 00 05 00 00 00 00 c7 d5 69 - 3361: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 ef 00 00 00 05 00 00 00 00 57 d8 f5 - 3362: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 f0 00 00 00 05 00 00 00 00 67 54 56 - 3363: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 f1 00 00 00 05 00 00 00 00 f7 59 ca - 3364: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 f2 00 00 00 05 00 00 00 00 07 4d 2d - 3365: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 f3 00 00 00 05 00 00 00 00 97 40 b1 - 3366: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 f4 00 00 00 05 00 00 00 00 a7 66 a0 - 3367: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 f5 00 00 00 05 00 00 00 00 37 6b 3c - 3368: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 f6 00 00 00 05 00 00 00 00 c7 7f db - 3369: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 f7 00 00 00 05 00 00 00 00 57 72 47 - 3370: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 f8 00 00 00 05 00 00 00 00 a7 33 f9 - 3371: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 f9 00 00 00 05 00 00 00 00 37 3e 65 - 3372: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 fa 00 00 00 05 00 00 00 00 c7 2a 82 - 3373: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 fb 00 00 00 05 00 00 00 00 57 27 1e - 3374: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 fc 00 00 00 05 00 00 00 00 67 01 0f - 3375: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 fd 00 00 00 05 00 00 00 00 f7 0c 93 - 3376: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 fe 00 00 00 05 00 00 00 00 07 18 74 - 3377: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f5 ff 00 00 00 05 00 00 00 00 97 15 e8 - 3378: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 00 00 00 00 05 00 00 00 00 6c a0 5a - 3379: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 01 00 00 00 05 00 00 00 00 fc ad c6 - 3380: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 02 00 00 00 05 00 00 00 00 0c b9 21 - 3381: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 03 00 00 00 05 00 00 00 00 9c b4 bd - 3382: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 04 00 00 00 05 00 00 00 00 ac 92 ac - 3383: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 05 00 00 00 05 00 00 00 00 3c 9f 30 - 3384: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 06 00 00 00 05 00 00 00 00 cc 8b d7 - 3385: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 07 00 00 00 05 00 00 00 00 5c 86 4b - 3386: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 08 00 00 00 05 00 00 00 00 ac c7 f5 - 3387: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 09 00 00 00 05 00 00 00 00 3c ca 69 - 3388: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 0a 00 00 00 05 00 00 00 00 cc de 8e - 3389: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 0b 00 00 00 05 00 00 00 00 5c d3 12 - 3390: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 0c 00 00 00 05 00 00 00 00 6c f5 03 - 3391: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 0d 00 00 00 05 00 00 00 00 fc f8 9f - 3392: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 0e 00 00 00 05 00 00 00 00 0c ec 78 - 3393: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 0f 00 00 00 05 00 00 00 00 9c e1 e4 - 3394: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 10 00 00 00 05 00 00 00 00 ac 6d 47 - 3395: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 11 00 00 00 05 00 00 00 00 3c 60 db - 3396: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 12 00 00 00 05 00 00 00 00 cc 74 3c - 3397: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 13 00 00 00 05 00 00 00 00 5c 79 a0 - 3398: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 14 00 00 00 05 00 00 00 00 6c 5f b1 - 3399: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 15 00 00 00 05 00 00 00 00 fc 52 2d - 3400: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 16 00 00 00 05 00 00 00 00 0c 46 ca - 3401: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 17 00 00 00 05 00 00 00 00 9c 4b 56 - 3402: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 18 00 00 00 05 00 00 00 00 6c 0a e8 - 3403: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 19 00 00 00 05 00 00 00 00 fc 07 74 - 3404: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 1a 00 00 00 05 00 00 00 00 0c 13 93 - 3405: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 1b 00 00 00 05 00 00 00 00 9c 1e 0f - 3406: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 1c 00 00 00 05 00 00 00 00 ac 38 1e - 3407: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 1d 00 00 00 05 00 00 00 00 3c 35 82 - 3408: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 1e 00 00 00 05 00 00 00 00 cc 21 65 - 3409: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 1f 00 00 00 05 00 00 00 00 5c 2c f9 - 3410: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 20 00 00 00 05 00 00 00 00 ad 39 22 - 3411: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 21 00 00 00 05 00 00 00 00 3d 34 be - 3412: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 22 00 00 00 05 00 00 00 00 cd 20 59 - 3413: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 23 00 00 00 05 00 00 00 00 5d 2d c5 - 3414: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 24 00 00 00 05 00 00 00 00 6d 0b d4 - 3415: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 25 00 00 00 05 00 00 00 00 fd 06 48 - 3416: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 26 00 00 00 05 00 00 00 00 0d 12 af - 3417: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 27 00 00 00 05 00 00 00 00 9d 1f 33 - 3418: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 28 00 00 00 05 00 00 00 00 6d 5e 8d - 3419: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 29 00 00 00 05 00 00 00 00 fd 53 11 - 3420: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 2a 00 00 00 05 00 00 00 00 0d 47 f6 - 3421: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 2b 00 00 00 05 00 00 00 00 9d 4a 6a - 3422: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 2c 00 00 00 05 00 00 00 00 ad 6c 7b - 3423: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 2d 00 00 00 05 00 00 00 00 3d 61 e7 - 3424: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 2e 00 00 00 05 00 00 00 00 cd 75 00 - 3425: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 2f 00 00 00 05 00 00 00 00 5d 78 9c - 3426: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 30 00 00 00 05 00 00 00 00 6d f4 3f - 3427: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 31 00 00 00 05 00 00 00 00 fd f9 a3 - 3428: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 32 00 00 00 05 00 00 00 00 0d ed 44 - 3429: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 33 00 00 00 05 00 00 00 00 9d e0 d8 - 3430: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 34 00 00 00 05 00 00 00 00 ad c6 c9 - 3431: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 35 00 00 00 05 00 00 00 00 3d cb 55 - 3432: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 36 00 00 00 05 00 00 00 00 cd df b2 - 3433: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 37 00 00 00 05 00 00 00 00 5d d2 2e - 3434: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 38 00 00 00 05 00 00 00 00 ad 93 90 - 3435: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 39 00 00 00 05 00 00 00 00 3d 9e 0c - 3436: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 3a 00 00 00 05 00 00 00 00 cd 8a eb - 3437: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 3b 00 00 00 05 00 00 00 00 5d 87 77 - 3438: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 3c 00 00 00 05 00 00 00 00 6d a1 66 - 3439: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 3e 00 00 00 05 00 00 00 00 0d b8 1d - 3440: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 3f 00 00 00 05 00 00 00 00 9d b5 81 - 3441: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 40 00 00 00 05 00 00 00 00 af 91 e8 - 3442: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 41 00 00 00 05 00 00 00 00 3f 9c 74 - 3443: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 42 00 00 00 05 00 00 00 00 cf 88 93 - 3444: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 43 00 00 00 05 00 00 00 00 5f 85 0f - 3445: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 44 00 00 00 05 00 00 00 00 6f a3 1e - 3446: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 45 00 00 00 05 00 00 00 00 ff ae 82 - 3447: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 46 00 00 00 05 00 00 00 00 0f ba 65 - 3448: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 47 00 00 00 05 00 00 00 00 9f b7 f9 - 3449: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 48 00 00 00 05 00 00 00 00 6f f6 47 - 3450: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 49 00 00 00 05 00 00 00 00 ff fb db - 3451: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 4a 00 00 00 05 00 00 00 00 0f ef 3c - 3452: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 4b 00 00 00 05 00 00 00 00 9f e2 a0 - 3453: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 4c 00 00 00 05 00 00 00 00 af c4 b1 - 3454: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 4d 00 00 00 05 00 00 00 00 3f c9 2d - 3455: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 4e 00 00 00 05 00 00 00 00 cf dd ca - 3456: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 4f 00 00 00 05 00 00 00 00 5f d0 56 - 3457: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 50 00 00 00 05 00 00 00 00 6f 5c f5 - 3458: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 51 00 00 00 05 00 00 00 00 ff 51 69 - 3459: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 52 00 00 00 05 00 00 00 00 0f 45 8e - 3460: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 53 00 00 00 05 00 00 00 00 9f 48 12 - 3461: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 54 00 00 00 05 00 00 00 00 af 6e 03 - 3462: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 55 00 00 00 05 00 00 00 00 3f 63 9f - 3463: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 56 00 00 00 05 00 00 00 00 cf 77 78 - 3464: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 57 00 00 00 05 00 00 00 00 5f 7a e4 - 3465: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 58 00 00 00 05 00 00 00 00 af 3b 5a - 3466: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 59 00 00 00 05 00 00 00 00 3f 36 c6 - 3467: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 5a 00 00 00 05 00 00 00 00 cf 22 21 - 3468: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 5b 00 00 00 05 00 00 00 00 5f 2f bd - 3469: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 5c 00 00 00 05 00 00 00 00 6f 09 ac - 3470: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 5d 00 00 00 05 00 00 00 00 ff 04 30 - 3471: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 5e 00 00 00 05 00 00 00 00 0f 10 d7 - 3472: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 5f 00 00 00 05 00 00 00 00 9f 1d 4b - 3473: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 60 00 00 00 05 00 00 00 00 6e 08 90 - 3474: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 61 00 00 00 05 00 00 00 00 fe 05 0c - 3475: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 62 00 00 00 05 00 00 00 00 0e 11 eb - 3476: len=27 | 15 74 60 81 45 78 56 34 12 80 0b 00 62 41 f6 63 00 00 00 05 00 00 00 00 9e 1c 77 +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:17:30.537507 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 01 00 01 01 38 00 03 00 0a 01 39 00 04 00 0d 00 00 94 +2022-05-02 20:17:30.585825 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 02 8f ad 00 00 86 a6 06 29 06 37 08 dd 13 88 00 00 c5 +2022-05-02 20:17:30.627815 Received 23 bytes on channel 61: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b8 0a b5 5f ff b1 +2022-05-02 20:17:30.627815 Decoded: 44 string1= 31.2VDC 0.03A 1.0W 36781Wh 1577Wh/day string2= 31.3VDC 0.04A 1.3W 34470Wh 1591Wh/day phase1= 226.9VAC 0.0A 0.0W inverter=114172220143 50.0Hz 18.4°C +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:17:35.898058 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 01 00 01 01 38 00 03 00 0a 01 38 00 04 00 0d 00 00 95 +2022-05-02 20:17:35.946379 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 02 8f ad 00 00 86 a6 06 29 06 37 08 dd 13 88 00 00 c5 +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:17:36.276310 Received 23 bytes on channel 61: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b8 0a b6 9e d2 5e +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:17:37.686338 Received 23 bytes on channel 61: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b8 0a b6 9e 13 9f +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:17:39.090886 Received 23 bytes on channel 75: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b8 0a b6 b5 9b 3c +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:17:39.350581 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 01 00 01 01 37 00 03 00 0b 01 38 00 04 00 0d 00 00 9b +2022-05-02 20:17:39.398900 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 02 8f ad 00 00 86 a6 06 29 06 37 08 dd 13 87 00 00 ca +2022-05-02 20:17:39.440872 Received 23 bytes on channel 61: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b8 0a b6 b5 9b 3c +2022-05-02 20:17:39.440872 Decoded: 44 string1= 31.1VDC 0.03A 1.1W 36781Wh 1577Wh/day string2= 31.2VDC 0.04A 1.3W 34470Wh 1591Wh/day phase1= 226.9VAC 0.0A 0.0W inverter=114172220143 49.99Hz 18.4°C +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:17:44.716418 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 01 00 01 01 38 00 03 00 0a 01 38 00 04 00 0d 00 00 95 +2022-05-02 20:17:44.764740 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 02 8f ad 00 00 86 a6 06 29 06 37 08 de 13 87 00 00 c9 +2022-05-02 20:17:44.806715 Received 23 bytes on channel 61: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b8 0a b6 90 85 07 +2022-05-02 20:17:44.806715 Decoded: 44 string1= 31.2VDC 0.03A 1.0W 36781Wh 1577Wh/day string2= 31.2VDC 0.04A 1.3W 34470Wh 1591Wh/day phase1= 227.0VAC 0.0A 0.0W inverter=114172220143 49.99Hz 18.4°C +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:17:50.210592 Received 23 bytes on channel 61: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b7 0a b7 53 b5 fa +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:17:50.458445 Received 27 bytes on channel 3: 95 72 22 01 43 72 22 01 43 01 00 01 01 38 00 03 00 0a 01 38 00 04 00 0d 00 00 95 +2022-05-02 20:17:50.500825 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 02 8f ad 00 00 86 a6 06 29 06 37 08 df 13 87 00 00 c8 +2022-05-02 20:17:50.548964 Received 23 bytes on channel 75: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b7 0a b8 57 f5 b1 +2022-05-02 20:17:50.548964 Decoded: 44 string1= 31.2VDC 0.03A 1.0W 36781Wh 1577Wh/day string2= 31.2VDC 0.04A 1.3W 34470Wh 1591Wh/day phase1= 227.1VAC 0.0A 0.0W inverter=114172220143 49.99Hz 18.3°C +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:17:55.892247 Received 23 bytes on channel 75: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b8 0a b8 a0 cb 77 +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:17:58.334025 Received 23 bytes on channel 61: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b8 0a b9 a2 42 fd +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:17:58.599447 Received 27 bytes on channel 3: 95 72 22 01 43 72 22 01 43 01 00 01 01 37 00 03 00 0b 01 37 00 04 00 0d 00 00 94 +2022-05-02 20:17:58.641489 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 02 8f ad 00 00 86 a6 06 29 06 37 08 e0 13 87 00 00 f7 +2022-05-02 20:17:58.689386 Received 23 bytes on channel 75: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b8 0a b9 a2 42 fd +2022-05-02 20:17:58.689386 Decoded: 44 string1= 31.1VDC 0.03A 1.1W 36781Wh 1577Wh/day string2= 31.1VDC 0.04A 1.3W 34470Wh 1591Wh/day phase1= 227.2VAC 0.0A 0.0W inverter=114172220143 49.99Hz 18.4°C +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:18:03.972211 Received 27 bytes on channel 3: 95 72 22 01 43 72 22 01 43 01 00 01 01 37 00 03 00 0b 01 37 00 04 00 0d 00 00 94 +2022-05-02 20:18:04.014786 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 02 8f ad 00 00 86 a6 06 29 06 37 08 df 13 86 00 00 c9 +2022-05-02 20:18:04.062861 Received 23 bytes on channel 75: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b8 0a b9 33 3f 11 +2022-05-02 20:18:04.062861 Decoded: 44 string1= 31.1VDC 0.03A 1.1W 36781Wh 1577Wh/day string2= 31.1VDC 0.04A 1.3W 34470Wh 1591Wh/day phase1= 227.1VAC 0.0A 0.0W inverter=114172220143 49.98Hz 18.4°C +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:18:09.338889 Received 27 bytes on channel 3: 95 72 22 01 43 72 22 01 43 01 00 01 01 37 00 03 00 0b 01 37 00 04 00 0d 00 00 94 +2022-05-02 20:18:09.381398 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 02 8f ad 00 00 86 a6 06 29 06 37 08 df 13 86 00 00 c9 +2022-05-02 20:18:09.429282 Received 23 bytes on channel 75: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b7 0a ba 31 4f 6f +2022-05-02 20:18:09.429282 Decoded: 44 string1= 31.1VDC 0.03A 1.1W 36781Wh 1577Wh/day string2= 31.1VDC 0.04A 1.3W 34470Wh 1591Wh/day phase1= 227.1VAC 0.0A 0.0W inverter=114172220143 49.98Hz 18.3°C +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:18:14.698694 Received 27 bytes on channel 3: 95 72 22 01 43 72 22 01 43 01 00 01 01 37 00 03 00 0b 01 37 00 04 00 0d 00 00 94 +2022-05-02 20:18:14.741020 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 02 8f ad 00 00 86 a6 06 29 06 37 08 df 13 86 00 00 c9 +2022-05-02 20:18:14.789129 Received 23 bytes on channel 75: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b7 0a bb f1 8e 6f +2022-05-02 20:18:14.789129 Decoded: 44 string1= 31.1VDC 0.03A 1.1W 36781Wh 1577Wh/day string2= 31.1VDC 0.04A 1.3W 34470Wh 1591Wh/day phase1= 227.1VAC 0.0A 0.0W inverter=114172220143 49.98Hz 18.3°C +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:18:20.093249 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 02 8f ad 00 00 86 a6 06 29 06 37 08 de 13 86 00 00 c8 +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:18:20.464025 Received 23 bytes on channel 75: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b9 0a bd 9c a6 22 +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:18:20.823208 Received 23 bytes on channel 61: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b9 0a bd 9c e7 63 +2022-05-02 16:41:16.044179 Transmit | 15 72 22 01 43 78 56 34 12 80 0b 00 62 3c 8e cf 00 00 00 05 00 00 00 00 35 a3 08 +2022-05-02 20:18:21.135380 Received 27 bytes on channel 75: 95 72 22 01 43 72 22 01 43 02 8f ad 00 00 86 a6 06 29 06 37 08 de 13 86 00 00 c8 +2022-05-02 20:18:21.183390 Received 23 bytes on channel 75: 95 72 22 01 43 72 22 01 43 83 00 00 00 00 00 00 00 b9 0a bd 9c e7 63 diff --git a/tools/rpi/hoymiles/__init__.py b/tools/rpi/hoymiles/__init__.py new file mode 100644 index 00000000..710595e9 --- /dev/null +++ b/tools/rpi/hoymiles/__init__.py @@ -0,0 +1,661 @@ +import struct +import crcmod +import json +import time +import re +from datetime import datetime +from RF24 import RF24, RF24_PA_LOW, RF24_PA_MAX, RF24_250KBPS, RF24_CRC_DISABLED, RF24_CRC_8, RF24_CRC_16 +from .decoders import * + +f_crc_m = crcmod.predefined.mkPredefinedCrcFun('modbus') +f_crc8 = crcmod.mkCrcFun(0x101, initCrc=0, xorOut=0) + + +HOYMILES_TRANSACTION_LOGGING=False +HOYMILES_DEBUG_LOGGING=False + +def ser_to_hm_addr(s): + """ + Calculate the 4 bytes that the HM devices use in their internal messages to + address each other. + + :param str s: inverter serial + :return: inverter address + :rtype: bytes + """ + bcd = int(str(s)[-8:], base=16) + return struct.pack('>L', bcd) + +def ser_to_esb_addr(s): + """ + Convert a Hoymiles inverter/DTU serial number into its + corresponding NRF24 'enhanced shockburst' address byte sequence (5 bytes). + + The NRF library expects these in LSB to MSB order, even though the transceiver + itself will then output them in MSB-to-LSB order over the air. + + The inverters use a BCD representation of the last 8 + digits of their serial number, in reverse byte order, + followed by \x01. + + :param str s: inverter serial + :return: ESB inverter address + :rtype: bytes + """ + air_order = ser_to_hm_addr(s)[::-1] + b'\x01' + return air_order[::-1] + +def print_addr(a): + """ + Debug print addresses + + :param str a: inverter serial + """ + print(f"ser# {a} ", end='') + print(f" -> HM {' '.join([f'{x:02x}' for x in ser_to_hm_addr(a)])}", end='') + print(f" -> ESB {' '.join([f'{x:02x}' for x in ser_to_esb_addr(a)])}") + +# time of last transmission - to calculcate response time +t_last_tx = 0 + +class ResponseDecoderFactory: + """ + Prepare payload decoder + + :param bytes response: ESB response frame to decode + :param request: ESB request frame + :type request: bytes + :param inverter_ser: inverter serial + :type inverter_ser: str + """ + model = None + request = None + response = None + + def __init__(self, response, **params): + self.response = response + + if 'request' in params: + self.request = params['request'] + elif hasattr(response, 'request'): + self.request = response.request + + if 'inverter_ser' in params: + self.inverter_ser = params['inverter_ser'] + self.model = self.inverter_model + + def unpack(self, fmt, base): + """ + Data unpack helper + + :param str fmt: struct format string + :param int base: unpack base position from self.response bytes + :return: unpacked values + :rtype: tuple + """ + size = struct.calcsize(fmt) + return struct.unpack(fmt, self.response[base:base+size]) + + @property + def inverter_model(self): + """ + Find decoder for inverter model + + :return: suitable decoder model string + :rtype: str + :raises ValueError: on invalid inverter serial + :raises NotImplementedError: if inverter model can not be determined + """ + if not self.inverter_ser: + raise ValueError('Inverter serial while decoding response') + + ser_db = [ + ('HM300', r'^1121........'), + ('HM600', r'^1141........'), + ('HM1200', r'^1161........'), + ] + ser_str = str(self.inverter_ser) + + model = None + for m, r in ser_db: + if re.match(r, ser_str): + model = m + break + + if len(model): + return model + raise NotImplementedError('Model lookup failed for serial {ser_str}') + + @property + def request_command(self): + """ + Return requested command identifier byte + + :return: hexlified command byte string + :rtype: str + """ + r_code = self.request[10] + return f'{r_code:02x}' + +class ResponseDecoder(ResponseDecoderFactory): + """ + Base response + + :param bytes response: ESB frame response + """ + def __init__(self, response, **params): + """Initialize ResponseDecoder""" + ResponseDecoderFactory.__init__(self, response, **params) + + def decode(self): + """ + Decode Payload + + :return: payload decoder instance + :rtype: object + """ + model = self.inverter_model + command = self.request_command + + model_decoders = __import__(f'hoymiles.decoders') + if hasattr(model_decoders, f'{model}_Decode{command.upper()}'): + device = getattr(model_decoders, f'{model}_Decode{command.upper()}') + else: + if HOYMILES_DEBUG_LOGGING: + device = getattr(model_decoders, f'DEBUG_DecodeAny') + + return device(self.response) + +class InverterPacketFragment: + """ESB Frame""" + def __init__(self, time_rx=None, payload=None, ch_rx=None, ch_tx=None, **params): + """ + Callback: get's invoked whenever a Nordic ESB packet has been received. + + :param time_rx: datetime when frame was received + :type time_rx: datetime + :param payload: payload bytes + :type payload: bytes + :param ch_rx: channel where packet was received + :type ch_rx: int + :param ch_tx: channel where request was sent + :type ch_tx: int + """ + + if not time_rx: + time_rx = datetime.now() + self.time_rx = time_rx + + self.frame = payload + + # check crc8 + if f_crc8(payload[:-1]) != payload[-1]: + raise BufferError('Frame kaputt') + + self.ch_rx = ch_rx + self.ch_tx = ch_tx + + @property + def mid(self): + """Transaction counter""" + return self.frame[0] + + @property + def src(self): + """ + Sender adddress + + :return: sender address + :rtype: int + """ + src = struct.unpack('>L', self.frame[1:5]) + return src[0] + @property + def dst(self): + """ + Receiver adddress + + :return: receiver address + :rtype: int + """ + dst = struct.unpack('>L', self.frame[5:8]) + return dst[0] + @property + def seq(self): + """ + Framne sequence number + + :return: sequence number + :rtype: int + """ + result = struct.unpack('>B', self.frame[9:10]) + return result[0] + @property + def data(self): + """ + Data without protocol framing + + :return: payload chunk + :rtype: bytes + """ + return self.frame[10:-1] + + def __str__(self): + """ + Represent received ESB frame + + :return: log line received frame + :rtype: str + """ + dt = self.time_rx.strftime("%Y-%m-%d %H:%M:%S.%f") + size = len(self.frame) + channel = f' channel {self.ch_rx}' if self.ch_rx else '' + raw = " ".join([f"{b:02x}" for b in self.frame]) + return f"{dt} Received {size} bytes{channel}: {raw}" + +class HoymilesNRF: + """Hoymiles NRF24 Interface""" + tx_channel_id = 0 + tx_channel_list = [40] + rx_channel_id = 0 + rx_channel_list = [3,23,40,61,75] + rx_channel_ack = False + rx_error = 0 + + def __init__(self, device): + """ + Claim radio device + + :param NRF24 device: instance of NRF24 + """ + self.radio = device + + def transmit(self, packet): + """ + Transmit Packet + + :param bytes packet: buffer to send + :return: if ACK received of ACK disabled + :rtype: bool + """ + + inv_esb_addr = b'\01' + packet[1:5] + dtu_esb_addr = b'\01' + packet[5:9] + + self.radio.stopListening() # put radio in TX mode + self.radio.setDataRate(RF24_250KBPS) + #self.radio.setPALevel(RF24_PA_LOW) + self.radio.openReadingPipe(1,dtu_esb_addr) + self.radio.openWritingPipe(inv_esb_addr) + self.radio.setChannel(self.tx_channel) + self.radio.setAutoAck(True) + self.radio.setRetries(3, 15) + self.radio.setCRCLength(RF24_CRC_16) + self.radio.enableDynamicPayloads() + + return self.radio.write(packet) + + def receive(self, timeout=None): + """ + Receive Packets + + :param timeout: receive timeout in nanoseconds (default: 12e8) + :type timeout: int + :yields: fragment + """ + + if not timeout: + timeout=12e8 + + self.radio.setChannel(self.rx_channel) + self.radio.setAutoAck(False) + self.radio.setRetries(0, 0) + self.radio.enableDynamicPayloads() + self.radio.setCRCLength(RF24_CRC_16) + self.radio.startListening() + + fragments = [] + + # Receive: Loop + t_end = time.monotonic_ns()+timeout + while time.monotonic_ns() < t_end: + + has_payload, pipe_number = self.radio.available_pipe() + if has_payload: + # Data in nRF24 buffer, read it + self.rx_error = 0 + self.rx_channel_ack = True + t_end = time.monotonic_ns()+5e8 + + size = self.radio.getDynamicPayloadSize() + payload = self.radio.read(size) + fragment = InverterPacketFragment( + payload=payload, + ch_rx=self.rx_channel, ch_tx=self.tx_channel, + time_rx=datetime.now() + ) + yield(fragment) + + else: + # No data in nRF rx buffer, search and wait + # Channel lock in (not currently used) + self.rx_error = self.rx_error + 1 + if self.rx_error > 1: + self.rx_channel_ack = False + # Channel hopping + if self.next_rx_channel(): + self.radio.stopListening() + self.radio.setChannel(self.rx_channel) + self.radio.startListening() + + time.sleep(0.005) + + def next_rx_channel(self): + """ + Select next channel from hop list + - if hopping enabled + - if channel has no ack + + :return: if new channel selected + :rtype: bool + """ + if not self.rx_channel_ack: + self.rx_channel_id = self.rx_channel_id + 1 + if self.rx_channel_id >= len(self.rx_channel_list): + self.rx_channel_id = 0 + return True + return False + + @property + def tx_channel(self): + """ + Get current tx channel + + :return: tx_channel + :rtype: int + """ + return self.tx_channel_list[self.tx_channel_id] + + @property + def rx_channel(self): + """ + Get current rx channel + + :return: rx_channel + :rtype: int + """ + return self.rx_channel_list[self.rx_channel_id] + +def frame_payload(payload): + """ + Prepare payload for transmission, append Modbus CRC16 + + :param bytes payload: payload to be prepared + :return: payload + crc + :rtype: bytes + """ + payload_crc = f_crc_m(payload) + payload = payload + struct.pack('>H', payload_crc) + + return payload + +def compose_esb_fragment(fragment, seq=b'\80', src=99999999, dst=1, **params): + """ + Build standart ESB request fragment + + :param bytes fragment: up to 16 bytes payload chunk + :param seq: frame sequence byte + :type seq: bytes + :param src: dtu address + :type src: int + :param dst: inverter address + :type dst: int + :return: esb frame fragment + :rtype: bytes + :raises ValueError: if fragment size larger 16 byte + """ + if len(fragment) > 17: + raise ValueError(f'ESB fragment exeeds mtu ({mtu}): Fragment size {len(fragment)} bytes') + + p = b'' + p = p + b'\x15' + p = p + ser_to_hm_addr(dst) + p = p + ser_to_hm_addr(src) + p = p + seq + + p = p + fragment + + crc8 = f_crc8(p) + p = p + struct.pack('B', crc8) + + return p + +def compose_esb_packet(packet, mtu=17, **params): + """ + Build ESB packet, chunk packet + + :param bytes packet: payload data + :param mtu: maximum transmission unit per frame (default: 17) + :type mtu: int + :yields: fragment + """ + for i in range(0, len(packet), mtu): + fragment = compose_esb_fragment(packet[i:i+mtu], **params) + yield(fragment) + +def compose_set_time_payload(timestamp=None): + """ + Build set time request packet + + :param timestamp: time to set (default: int(time.time()) ) + :type timestamp: int + :return: payload + :rtype: bytes + """ + if not timestamp: + timestamp = int(time.time()) + + payload = b'\x0b\x00' + payload = payload + struct.pack('>L', timestamp) # big-endian: msb at low address + payload = payload + b'\x00\x00\x00\x05\x00\x00\x00\x00' + + return frame_payload(payload) + +class InverterTransaction: + """ + Inverter transaction buffer, implements transport-layer functions while + communicating with Hoymiles inverters + """ + tx_queue = [] + scratch = [] + inverter_ser = None + inverter_addr = None + dtu_ser = None + req_type = None + + radio = None + + def __init__(self, + request_time=None, + inverter_ser=None, + dtu_ser=None, + radio=None, + **params): + """ + :param request: Transmit ESB packet + :type request: bytes + :param request_time: datetime of transmission + :type request_time: datetime + :param inverter_ser: inverter serial + :type inverter_ser: str + :param dtu_ser: DTU serial + :type dtu_ser: str + :param radio: HoymilesNRF instance to use + :type radio: HoymilesNRF or None + """ + + if radio: + self.radio = radio + + if not request_time: + request_time=datetime.now() + + self.scratch = [] + if 'scratch' in params: + self.scratch = params['scratch'] + + self.inverter_ser = inverter_ser + if inverter_ser: + self.inverter_addr = ser_to_hm_addr(inverter_ser) + + self.dtu_ser = dtu_ser + if dtu_ser: + self.dtu_addr = ser_to_hm_addr(dtu_ser) + + self.request = None + if 'request' in params: + self.request = params['request'] + self.queue_tx(self.request) + self.inverter_addr, self.dtu_addr, seq, self.req_type = struct.unpack('>LLBB', params['request'][1:11]) + self.request_time = request_time + + def rxtx(self): + """ + Transmit next packet from tx_queue if available + and wait for responses + + :return: if we got contact + :rtype: bool + """ + if not self.radio: + return False + + if not len(self.tx_queue): + return False + + packet = self.tx_queue.pop(0) + + if HOYMILES_TRANSACTION_LOGGING: + dt = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f") + print(f'{dt} Transmit {len(packet)} | {hexify_payload(packet)}') + + self.radio.transmit(packet) + + wait = False + try: + for response in self.radio.receive(): + if HOYMILES_TRANSACTION_LOGGING: + print(response) + + self.frame_append(response) + wait = True + except TimeoutError: + pass + + return wait + + def frame_append(self, frame): + """ + Append received raw frame to local scratch buffer + + :param bytes frame: Received ESB frame + :return None + """ + self.scratch.append(frame) + + def queue_tx(self, frame): + """ + Enqueue packet for transmission if radio is available + + :param bytes frame: ESB frame for transmit + :return: if radio is available and frame scheduled + :rtype: bool + """ + if not self.radio: + return False + + self.tx_queue.append(frame) + + return True + + def get_payload(self, src=None): + """ + Reconstruct Hoymiles payload from scratch buffer + + :param src: filter frames by inverter hm_address (default self.inverter_address) + :type src: bytes + :return: payload + :rtype: bytes + :raises BufferError: if one or more frames are missing + :raises ValueError: if assambled payload fails CRC check + """ + + if not src: + src = self.inverter_addr + + # Collect all frames from source_address src + frames = [frame for frame in self.scratch if frame.src == src] + + tr_len = 0 + # Find end frame and extract message frame count + try: + end_frame = next(frame for frame in frames if frame.seq > 0x80) + self.time_rx = end_frame.time_rx + tr_len = end_frame.seq - 0x80 + except StopIteration: + raise BufferError(f'Missing packet: Last packet {len(self.scratch)}') + + # Rebuild payload from unordered frames + payload = b'' + for frame_id in range(1, tr_len): + try: + data_frame = next(item for item in frames if item.seq == frame_id) + payload = payload + data_frame.data + except StopIteration: + self.__retransmit_frame(frame_id) + raise BufferError(f'Frame {frame_id} missing: Request Retransmit') + + payload = payload + end_frame.data + + # check crc + pcrc = struct.unpack('>H', payload[-2:])[0] + if f_crc_m(payload[:-2]) != pcrc: + raise ValueError('Payload failed CRC check.') + + return payload + + def __retransmit_frame(self, frame_id): + """ + Build and queue retransmit request + + :param int frame_id: frame id to re-schedule + :return: if successful scheduled + :rtype: bool + """ + packet = compose_esb_fragment(b'', + seq=int(0x80 + frame_id).to_bytes(1, 'big'), + src=self.dtu_ser, + dst=self.inverter_ser) + + return self.queue_tx(packet) + + def __str__(self): + """ + Represent transmit payload + + :return: log line of payload for transmission + :rtype: str + """ + dt = self.request_time.strftime("%Y-%m-%d %H:%M:%S.%f") + size = len(self.request) + return f'{dt} Transmit | {hexify_payload(self.request)}' + +def hexify_payload(byte_var): + """ + Represent bytes + + :param bytes byte_var: bytes to be hexlified + :return: two-byte while-space padded byte representation + :rtype: str + """ + return ' '.join([f"{b:02x}" for b in byte_var]) diff --git a/tools/rpi/hoymiles/__main__.py b/tools/rpi/hoymiles/__main__.py new file mode 100644 index 00000000..0a8c435e --- /dev/null +++ b/tools/rpi/hoymiles/__main__.py @@ -0,0 +1,261 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import sys +import struct +import re +import time +from datetime import datetime +import argparse +import hoymiles +from RF24 import RF24, RF24_PA_LOW, RF24_PA_MAX, RF24_250KBPS, RF24_CRC_DISABLED, RF24_CRC_8, RF24_CRC_16 +import paho.mqtt.client +import yaml +from yaml.loader import SafeLoader + +def main_loop(): + """Main loop""" + inverters = [ + inverter for inverter in ahoy_config.get('inverters', []) + if not inverter.get('disabled', False)] + + for inverter in inverters: + if hoymiles.HOYMILES_DEBUG_LOGGING: + print(f'Poll inverter {inverter["serial"]}') + poll_inverter(inverter) + +def poll_inverter(inverter, retries=4): + """ + Send/Receive command_queue, initiate status poll on inverter + + :param str inverter: inverter serial + :param retries: tx retry count if no inverter contact + :type retries: int + """ + inverter_ser = inverter.get('serial') + dtu_ser = ahoy_config.get('dtu', {}).get('serial') + + # Queue at least status data request + command_queue[str(inverter_ser)].append(hoymiles.compose_set_time_payload()) + + # Putt all queued commands for current inverter on air + while len(command_queue[str(inverter_ser)]) > 0: + payload = command_queue[str(inverter_ser)].pop(0) + + # Send payload {ttl}-times until we get at least one reponse + payload_ttl = retries + while payload_ttl > 0: + payload_ttl = payload_ttl - 1 + com = hoymiles.InverterTransaction( + radio=hmradio, + dtu_ser=dtu_ser, + inverter_ser=inverter_ser, + request=next(hoymiles.compose_esb_packet( + payload, + seq=b'\x80', + src=dtu_ser, + dst=inverter_ser + ))) + response = None + while com.rxtx(): + try: + response = com.get_payload() + payload_ttl = 0 + except Exception as e: + print(f'Error while retrieving data: {e}') + pass + + # Handle the response data if any + if response: + dt = datetime.now() + print(f'{dt} Payload: ' + hoymiles.hexify_payload(response)) + decoder = hoymiles.ResponseDecoder(response, + request=com.request, + inverter_ser=inverter_ser + ) + result = decoder.decode() + if isinstance(result, hoymiles.decoders.StatusResponse): + data = result.__dict__() + if hoymiles.HOYMILES_DEBUG_LOGGING: + print(f'{dt} Decoded: {data["temperature"]}', end='') + phase_id = 0 + for phase in data['phases']: + print(f' phase{phase_id}=voltage:{phase["voltage"]}, current:{phase["current"]}, power:{phase["power"]}, frequency:{data["frequency"]}', end='') + phase_id = phase_id + 1 + string_id = 0 + for string in data['strings']: + print(f' string{string_id}=voltage:{string["voltage"]}, current:{string["current"]}, power:{string["power"]}, total:{string["energy_total"]/1000}, daily:{string["energy_daily"]}', end='') + string_id = string_id + 1 + print() + + if mqtt_client: + mqtt_send_status(mqtt_client, inverter_ser, data, + topic=inverter.get('mqtt', {}).get('topic', None)) + +def mqtt_send_status(broker, inverter_ser, data, topic=None): + """ + Publish StatusResponse object + + :param paho.mqtt.client.Client broker: mqtt-client instance + :param str inverter_ser: inverter serial + :param hoymiles.StatusResponse data: decoded inverter StatusResponse + :param topic: custom mqtt topic prefix (default: hoymiles/{inverter_ser}) + :type topic: str + """ + + if not topic: + topic = f'hoymiles/{inverter_ser}' + + # AC Data + phase_id = 0 + for phase in data['phases']: + broker.publish(f'{topic}/emeter/{phase_id}/power', phase['power']) + broker.publish(f'{topic}/emeter/{phase_id}/voltage', phase['voltage']) + broker.publish(f'{topic}/emeter/{phase_id}/current', phase['current']) + phase_id = phase_id + 1 + + # DC Data + string_id = 0 + for string in data['strings']: + broker.publish(f'{topic}/emeter-dc/{string_id}/total', string['energy_total']/1000) + broker.publish(f'{topic}/emeter-dc/{string_id}/power', string['power']) + broker.publish(f'{topic}/emeter-dc/{string_id}/voltage', string['voltage']) + broker.publish(f'{topic}/emeter-dc/{string_id}/current', string['current']) + string_id = string_id + 1 + # Global + broker.publish(f'{topic}/frequency', data['frequency']) + broker.publish(f'{topic}/temperature', data['temperature']) + +def mqtt_on_command(client, userdata, message): + """ + Handle commands to topic + hoymiles/{inverter_ser}/command + frame a payload and put onto command_queue + + Inverters must have mqtt.send_raw_enabled: true configured + + This can be used to inject debug payloads + The message must be in hexlified format + + Use of variables: + tttttttt gets expanded to a current int(time) + + Example injects exactly the same as we normally use to poll data: + mosquitto -h broker -t inverter_topic/command -m 800b00tttttttt0000000500000000 + + This allows for even faster hacking during runtime + + :param paho.mqtt.client.Client client: mqtt-client instance + :param dict userdata: Userdata + :param dict message: mqtt-client message object + """ + try: + inverter_ser = next( + item[0] for item in mqtt_command_topic_subs if item[1] == message.topic) + except StopIteration: + print('Unexpedtedly received mqtt message for {message.topic}') + + if inverter_ser: + p_message = message.payload.decode('utf-8').lower() + + # Expand tttttttt to current time for use in hexlified payload + expand_time = ''.join(f'{b:02x}' for b in struct.pack('>L', int(time.time()))) + p_message = p_message.replace('tttttttt', expand_time) + + if (len(p_message) < 2048 \ + and len(p_message) % 2 == 0 \ + and re.match(r'^[a-f0-9]+$', p_message)): + payload = bytes.fromhex(p_message) + # commands must start with \x80 + if payload[0] == 0x80: + command_queue[str(inverter_ser)].append( + hoymiles.frame_payload(payload[1:])) + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Ahoy - Hoymiles solar inverter gateway', prog="hoymiles") + parser.add_argument("-c", "--config-file", nargs="?", required=True, + help="configuration file") + parser.add_argument("--log-transactions", action="store_true", default=False, + help="Enable transaction logging output") + parser.add_argument("--verbose", action="store_true", default=False, + help="Enable debug output") + global_config = parser.parse_args() + + # Load ahoy.yml config file + try: + if isinstance(global_config.config_file, str) == True: + with open(global_config.config_file, 'r') as yf: + cfg = yaml.load(yf, Loader=SafeLoader) + else: + with open('ahoy.yml', 'r') as yf: + cfg = yaml.load(yf, Loader=SafeLoader) + except FileNotFoundError: + print("Could not load config file. Try --help") + sys.exit(2) + except yaml.YAMLError as ye: + print('Failed to load config frile {global_config.config_file}: {ye}') + sys.exit(1) + + ahoy_config = dict(cfg.get('ahoy', {})) + + # Prepare for multiple transceivers, makes them configurable (currently + # only one supported) + for radio_config in ahoy_config.get('nrf', [{}]): + radio = RF24( + radio_config.get('ce_pin', 22), + radio_config.get('cs_pin', 0), + radio_config.get('spispeed', 1000000)) + hmradio = hoymiles.HoymilesNRF(device=radio) + + mqtt_client = None + + command_queue = {} + mqtt_command_topic_subs = [] + + if global_config.log_transactions: + hoymiles.HOYMILES_TRANSACTION_LOGGING=True + if global_config.verbose: + hoymiles.HOYMILES_DEBUG_LOGGING=True + + mqtt_config = ahoy_config.get('mqtt', []) + if not mqtt_config.get('disabled', False): + mqtt_client = paho.mqtt.client.Client() + mqtt_client.username_pw_set(mqtt_config.get('user', None), mqtt_config.get('password', None)) + mqtt_client.connect(mqtt_config.get('host', '127.0.0.1'), mqtt_config.get('port', 1883)) + mqtt_client.loop_start() + mqtt_client.on_message = mqtt_on_command + + if not radio.begin(): + raise RuntimeError('Can\'t open radio') + + inverters = [inverter.get('serial') for inverter in ahoy_config.get('inverters', [])] + for inverter in ahoy_config.get('inverters', []): + inverter_ser = inverter.get('serial') + command_queue[str(inverter_ser)] = [] + + # + # Enables and subscribe inverter to mqtt /command-Topic + # + if mqtt_client and inverter.get('mqtt', {}).get('send_raw_enabled', False): + topic_item = ( + str(inverter_ser), + inverter.get('mqtt', {}).get('topic', f'hoymiles/{inverter_ser}') + '/command' + ) + mqtt_client.subscribe(topic_item[1]) + mqtt_command_topic_subs.append(topic_item) + + loop_interval = ahoy_config.get('interval', 1) + try: + while True: + t_loop_start = time.time() + + main_loop() + + print('', end='', flush=True) + + if loop_interval > 0 and (time.time() - t_loop_start) < loop_interval: + time.sleep(time.time() % loop_interval) + + except KeyboardInterrupt: + radio.powerDown() + sys.exit() diff --git a/tools/rpi/hoymiles/decoders/__init__.py b/tools/rpi/hoymiles/decoders/__init__.py new file mode 100644 index 00000000..68bef7f5 --- /dev/null +++ b/tools/rpi/hoymiles/decoders/__init__.py @@ -0,0 +1,587 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +import struct +import crcmod +from datetime import timedelta + +f_crc_m = crcmod.predefined.mkPredefinedCrcFun('modbus') + +class StatusResponse: + """Inverter StatusResponse object""" + e_keys = ['voltage','current','power','energy_total','energy_daily'] + + def unpack(self, fmt, base): + """ + Data unpack helper + + :param str fmt: struct format string + :param int base: unpack base position from self.response bytes + :return: unpacked values + :rtype: tuple + """ + size = struct.calcsize(fmt) + return struct.unpack(fmt, self.response[base:base+size]) + + @property + def phases(self): + """ + AC power data + + :retrun: list of dict's + :rtype: list + """ + phases = [] + p_exists = True + while p_exists: + p_exists = False + phase_id = len(phases) + phase = {} + for key in self.e_keys: + prop = f'ac_{key}_{phase_id}' + if hasattr(self, prop): + p_exists = True + phase[key] = getattr(self, prop) + if p_exists: + phases.append(phase) + + return phases + + @property + def strings(self): + """ + DC PV-string data + + :retrun: list of dict's + :rtype: list + """ + strings = [] + s_exists = True + while s_exists: + s_exists = False + string_id = len(strings) + string = {} + for key in self.e_keys: + prop = f'dc_{key}_{string_id}' + if hasattr(self, prop): + s_exists = True + string[key] = getattr(self, prop) + if s_exists: + strings.append(string) + + return strings + + def __dict__(self): + """ + Get all known data + + :return: dict of properties + :rtype: dict + """ + data = {} + data['phases'] = self.phases + data['strings'] = self.strings + data['temperature'] = self.temperature + data['frequency'] = self.frequency + return data + +class UnknownResponse: + """ + Debugging helper for unknown payload format + """ + @property + def hex_ascii(self): + """ + Generate white-space separated byte representation + + :return: hexlifierd byte string + :rtype: str + """ + return ' '.join([f'{b:02x}' for b in self.response]) + + @property + def valid_crc(self): + """ + Checks if self.response has valid Modbus CRC + + :return: if crc is available and correct + :rtype: bool + """ + # check crc + pcrc = struct.unpack('>H', self.response[-2:])[0] + return f_crc_m(self.response[:-2]) == pcrc + + @property + def dump_longs(self): + """Get all data, interpreted as long""" + if len(self.response) < 5: + return None + + res = self.response + + r = len(res) % 16 + res = res[:r*-1] + + vals = None + if len(res) % 16 == 0: + n = len(res)/4 + vals = struct.unpack(f'>{int(n)}L', res) + + return vals + + @property + def dump_longs_pad1(self): + """Get all data, interpreted as long""" + if len(self.response) < 7: + return None + + res = self.response[2:] + + r = len(res) % 16 + res = res[:r*-1] + + vals = None + if len(res) % 16 == 0: + n = len(res)/4 + vals = struct.unpack(f'>{int(n)}L', res) + + return vals + + @property + def dump_longs_pad2(self): + """Get all data, interpreted as long""" + if len(self.response) < 9: + return None + + res = self.response[4:] + + r = len(res) % 16 + res = res[:r*-1] + + vals = None + if len(res) % 16 == 0: + n = len(res)/4 + vals = struct.unpack(f'>{int(n)}L', res) + + return vals + + @property + def dump_longs_pad3(self): + """Get all data, interpreted as long""" + if len(self.response) < 11: + return None + + res = self.response[6:] + + r = len(res) % 16 + res = res[:r*-1] + + vals = None + if len(res) % 16 == 0: + n = len(res)/4 + vals = struct.unpack(f'>{int(n)}L', res) + + return vals + + @property + def dump_shorts(self): + """Get all data, interpreted as short""" + if len(self.response) < 5: + return None + + res = self.response + + r = len(res) % 4 + res = res[:r*-1] + + vals = None + if len(res) % 4 == 0: + n = len(res)/2 + vals = struct.unpack(f'>{int(n)}H', res) + + return vals + + @property + def dump_shorts_pad1(self): + """Get all data, interpreted as short""" + if len(self.response) < 6: + return None + + res = self.response[1:] + + r = len(res) % 4 + res = res[:r*-1] + + vals = None + if len(res) % 4 == 0: + n = len(res)/2 + vals = struct.unpack(f'>{int(n)}H', res) + + return vals + +class EventsResponse(UnknownResponse): + + alarm_codes = { + 1: 'Inverter start', + 2: 'Producing power', + 121: 'Over temperature protection', + 125: 'Grid configuration parameter error', + 126: 'Software error code 126', + 127: 'Firmware error', + 128: 'Software error code 128', + 129: 'Software error code 129', + 130: 'Offline', + 141: 'Grid overvoltage', + 142: 'Average grid overvoltage', + 143: 'Grid undervoltage', + 144: 'Grid overfrequency', + 145: 'Grid underfrequency', + 146: 'Rapid grid frequency change', + 147: 'Power grid outage', + 148: 'Grid disconnection', + 149: 'Island detected', + 205: 'Input port 1 & 2 overvoltage', + 206: 'Input port 3 & 4 overvoltage', + 207: 'Input port 1 & 2 undervoltage', + 208: 'Input port 3 & 4 undervoltage', + 209: 'Port 1 no input', + 210: 'Port 2 no input', + 211: 'Port 3 no input', + 212: 'Port 4 no input', + 213: 'PV-1 & PV-2 abnormal wiring', + 214: 'PV-3 & PV-4 abnormal wiring', + 215: 'PV-1 Input overvoltage', + 216: 'PV-1 Input undervoltage', + 217: 'PV-2 Input overvoltage', + 218: 'PV-2 Input undervoltage', + 219: 'PV-3 Input overvoltage', + 220: 'PV-3 Input undervoltage', + 221: 'PV-4 Input overvoltage', + 222: 'PV-4 Input undervoltage', + 301: 'Hardware error code 301', + 302: 'Hardware error code 302', + 303: 'Hardware error code 303', + 304: 'Hardware error code 304', + 305: 'Hardware error code 305', + 306: 'Hardware error code 306', + 307: 'Hardware error code 307', + 308: 'Hardware error code 308', + 309: 'Hardware error code 309', + 310: 'Hardware error code 310', + 311: 'Hardware error code 311', + 312: 'Hardware error code 312', + 313: 'Hardware error code 313', + 314: 'Hardware error code 314', + 5041: 'Error code-04 Port 1', + 5042: 'Error code-04 Port 2', + 5043: 'Error code-04 Port 3', + 5044: 'Error code-04 Port 4', + 5051: 'PV Input 1 Overvoltage/Undervoltage', + 5052: 'PV Input 2 Overvoltage/Undervoltage', + 5053: 'PV Input 3 Overvoltage/Undervoltage', + 5054: 'PV Input 4 Overvoltage/Undervoltage', + 5060: 'Abnormal bias', + 5070: 'Over temperature protection', + 5080: 'Grid Overvoltage/Undervoltage', + 5090: 'Grid Overfrequency/Underfrequency', + 5100: 'Island detected', + 5120: 'EEPROM reading and writing error', + 5150: '10 min value grid overvoltage', + 5200: 'Firmware error', + 8310: 'Shut down', + 9000: 'Microinverter is suspected of being stolen' + } + + def __init__(self, response): + self.response = response + + crc_valid = self.valid_crc + if crc_valid: + print(' payload has valid modbus crc') + self.response = response[:-2] + + status = self.response[:2] + + chunk_size = 12 + for c in range(2, len(self.response), chunk_size): + chunk = self.response[c:c+chunk_size] + + print(' '.join([f'{b:02x}' for b in chunk]) + ': ') + + opcode, a_code, a_count, uptime_sec = struct.unpack('>BBHH', chunk[0:6]) + a_text = self.alarm_codes.get(a_code, 'N/A') + + print(f' uptime={timedelta(seconds=uptime_sec)} a_count={a_count} opcode={opcode} a_code={a_code} a_text={a_text}') + + for fmt in ['BBHHHHH']: + print(f' {fmt:7}: ' + str(struct.unpack('>' + fmt, chunk))) + print(end='', flush=True) + +class DEBUG_DecodeAny(UnknownResponse): + """Default decoder""" + def __init__(self, response): + """ + Try interpret and print unknown response data + + :param bytes response: response payload bytes + """ + self.response = response + + crc_valid = self.valid_crc + if crc_valid: + print(' payload has valid modbus crc') + self.response = response[:-2] + + l_payload = len(self.response) + print(f' payload has {l_payload} bytes') + + longs = self.dump_longs + if not longs: + print(' type long : unable to decode (len or not mod 4)') + else: + print(' type long : ' + str(longs)) + + longs = self.dump_longs_pad1 + if not longs: + print(' type long pad1 : unable to decode (len or not mod 4)') + else: + print(' type long pad1 : ' + str(longs)) + + longs = self.dump_longs_pad2 + if not longs: + print(' type long pad2 : unable to decode (len or not mod 4)') + else: + print(' type long pad2 : ' + str(longs)) + + longs = self.dump_longs_pad3 + if not longs: + print(' type long pad3 : unable to decode (len or not mod 4)') + else: + print(' type long pad3 : ' + str(longs)) + + shorts = self.dump_shorts + if not shorts: + print(' type short : unable to decode (len or not mod 2)') + else: + print(' type short : ' + str(shorts)) + + shorts = self.dump_shorts_pad1 + if not shorts: + print(' type short pad1: unable to decode (len or not mod 2)') + else: + print(' type short pad1: ' + str(shorts)) + + try: + if len(self.response) > 2: + print(' type utf-8 : ' + self.response.decode('utf-8')) + except UnicodeDecodeError: + print(' type utf-8 : utf-8 decode error') + + try: + if len(self.response) > 2: + print(' type ascii : ' + self.response.decode('ascii')) + except UnicodeDecodeError: + print(' type ascii : ascii decode error') + + +# 1121-Series Intervers, 1 MPPT, 1 Phase +class HM300_Decode0B(StatusResponse): + def __init__(self, response): + self.response = response + + @property + def dc_voltage_0(self): + return self.unpack('>H', 2)[0]/10 + @property + def dc_current_0(self): + return self.unpack('>H', 4)[0]/100 + @property + def dc_power_0(self): + return self.unpack('>H', 6)[0]/10 + @property + def dc_energy_total_0(self): + return self.unpack('>L', 8)[0] + @property + def dc_energy_daily_0(self): + return self.unpack('>H', 12)[0] + + + @property + def ac_voltage_0(self): + return self.unpack('>H', 14)[0]/10 + @property + def ac_current_0(self): + return self.unpack('>H', 22)[0]/100 + @property + def ac_power_0(self): + return self.unpack('>H', 18)[0]/10 + @property + def frequency(self): + return self.unpack('>H', 16)[0]/100 + @property + def temperature(self): + return self.unpack('>H', 26)[0]/10 + +class HM300_Decode11(EventsResponse): + def __init__(self, response): + super().__init__(response) + +class HM300_Decode12(EventsResponse): + def __init__(self, response): + super().__init__(response) + + + +# 1141-Series Inverters, 2 MPPT, 1 Phase +class HM600_Decode0B(StatusResponse): + def __init__(self, response): + self.response = response + + @property + def dc_voltage_0(self): + return self.unpack('>H', 2)[0]/10 + @property + def dc_current_0(self): + return self.unpack('>H', 4)[0]/100 + @property + def dc_power_0(self): + return self.unpack('>H', 6)[0]/10 + @property + def dc_energy_total_0(self): + return self.unpack('>L', 14)[0] + @property + def dc_energy_daily_0(self): + return self.unpack('>H', 22)[0] + + @property + def dc_voltage_1(self): + return self.unpack('>H', 8)[0]/10 + @property + def dc_current_1(self): + return self.unpack('>H', 10)[0]/100 + @property + def dc_power_1(self): + return self.unpack('>H', 12)[0]/10 + @property + def dc_energy_total_1(self): + return self.unpack('>L', 18)[0] + @property + def dc_energy_daily_1(self): + return self.unpack('>H', 24)[0] + + @property + def ac_voltage_0(self): + return self.unpack('>H', 26)[0]/10 + @property + def ac_current_0(self): + return self.unpack('>H', 34)[0]/10 + @property + def ac_power_0(self): + return self.unpack('>H', 30)[0]/10 + @property + def frequency(self): + return self.unpack('>H', 28)[0]/100 + @property + def temperature(self): + return self.unpack('>H', 38)[0]/10 + +class HM600_Decode11(EventsResponse): + def __init__(self, response): + super().__init__(response) + +class HM600_Decode12(EventsResponse): + def __init__(self, response): + super().__init__(response) + + +# 1161-Series Inverters, 4 MPPT, 1 Phase +class HM1200_Decode0B(StatusResponse): + def __init__(self, response): + self.response = response + + @property + def dc_voltage_0(self): + return self.unpack('>H', 2)[0]/10 + @property + def dc_current_0(self): + return self.unpack('>H', 4)[0]/100 + @property + def dc_power_0(self): + return self.unpack('>H', 8)[0]/10 + @property + def dc_energy_total_0(self): + return self.unpack('>L', 12)[0] + @property + def dc_energy_daily_0(self): + return self.unpack('>H', 20)[0] + + @property + def dc_voltage_1(self): + return self.unpack('>H', 2)[0]/10 + @property + def dc_current_1(self): + return self.unpack('>H', 4)[0]/100 + @property + def dc_power_1(self): + return self.unpack('>H', 10)[0]/10 + @property + def dc_energy_total_1(self): + return self.unpack('>L', 16)[0] + @property + def dc_energy_daily_1(self): + return self.unpack('>H', 22)[0] + + @property + def dc_voltage_2(self): + return self.unpack('>H', 24)[0]/10 + @property + def dc_current_2(self): + return self.unpack('>H', 26)[0]/100 + @property + def dc_power_2(self): + return self.unpack('>H', 30)[0]/10 + @property + def dc_energy_total_2(self): + return self.unpack('>L', 34)[0] + @property + def dc_energy_daily_2(self): + return self.unpack('>H', 42)[0] + + @property + def dc_voltage_3(self): + return self.unpack('>H', 24)[0]/10 + @property + def dc_current_3(self): + return self.unpack('>H', 28)[0]/100 + @property + def dc_power_3(self): + return self.unpack('>H', 32)[0]/10 + @property + def dc_energy_total_3(self): + return self.unpack('>L', 38)[0] + @property + def dc_energy_daily_3(self): + return self.unpack('>H', 44)[0] + + @property + def ac_voltage_0(self): + return self.unpack('>H', 46)[0]/10 + @property + def ac_current_0(self): + return self.unpack('>H', 54)[0]/100 + @property + def ac_power_0(self): + return self.unpack('>H', 50)[0]/10 + @property + def frequency(self): + return self.unpack('>H', 48)[0]/100 + @property + def temperature(self): + return self.unpack('>H', 58)[0]/10 + +class HM1200_Decode11(EventsResponse): + def __init__(self, response): + super().__init__(response) + +class HM1200_Decode12(EventsResponse): + def __init__(self, response): + super().__init__(response) diff --git a/tools/rpi/requirements.txt b/tools/rpi/requirements.txt index a26b1266..71eea3aa 100644 --- a/tools/rpi/requirements.txt +++ b/tools/rpi/requirements.txt @@ -1,2 +1,3 @@ -paho-mqtt -crcmod +paho-mqtt>=1.5 +crcmod>=1.7 +PyYAML>=5.0