move more code into InverterBase class

This commit is contained in:
Stefan Allius
2024-10-03 15:08:07 +02:00
parent cfe2c9cb9d
commit 22d59ed659
13 changed files with 892 additions and 559 deletions

View File

@@ -4,519 +4,193 @@
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: G Pages: 1 -->
<svg width="835pt" height="1800pt"
viewBox="0.00 0.00 835.00 1800.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1796)">
<svg width="463pt" height="882pt"
viewBox="0.00 0.00 463.35 882.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 878)">
<title>G</title>
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-1796 831,-1796 831,4 -4,4"/>
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-878 459.348,-878 459.348,4 -4,4"/>
<!-- A0 -->
<g id="node1" class="node">
<title>A0</title>
<polygon fill="#fff8dc" stroke="#000000" points="388.6964,-1768 280.3036,-1768 280.3036,-1732 394.6964,-1732 394.6964,-1762 388.6964,-1768"/>
<polyline fill="none" stroke="#000000" points="388.6964,-1768 388.6964,-1762 "/>
<polyline fill="none" stroke="#000000" points="394.6964,-1762 388.6964,-1762 "/>
<text text-anchor="middle" x="337.5" y="-1753" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">You can stick notes</text>
<text text-anchor="middle" x="337.5" y="-1741" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">on diagrams too!</text>
<polygon fill="#fff8dc" stroke="#000000" points="108.5444,-850 .1516,-850 .1516,-814 114.5444,-814 114.5444,-844 108.5444,-850"/>
<polyline fill="none" stroke="#000000" points="108.5444,-850 108.5444,-844 "/>
<polyline fill="none" stroke="#000000" points="114.5444,-844 108.5444,-844 "/>
<text text-anchor="middle" x="57.348" y="-835" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">You can stick notes</text>
<text text-anchor="middle" x="57.348" y="-823" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">on diagrams too!</text>
</g>
<!-- A1 -->
<g id="node2" class="node">
<title>A1</title>
<polygon fill="none" stroke="#000000" points="413.5,-1760 413.5,-1792 484.5,-1792 484.5,-1760 413.5,-1760"/>
<text text-anchor="start" x="423.445" y="-1773" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">IterRegistry</text>
<polygon fill="none" stroke="#000000" points="413.5,-1740 413.5,-1760 484.5,-1760 484.5,-1740 413.5,-1740"/>
<polygon fill="none" stroke="#000000" points="413.5,-1708 413.5,-1740 484.5,-1740 484.5,-1708 413.5,-1708"/>
<text text-anchor="start" x="430.939" y="-1721" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__iter__</text>
<polygon fill="none" stroke="#000000" points="133.348,-842 133.348,-874 204.348,-874 204.348,-842 133.348,-842"/>
<text text-anchor="start" x="143.293" y="-855" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">IterRegistry</text>
<polygon fill="none" stroke="#000000" points="133.348,-822 133.348,-842 204.348,-842 204.348,-822 133.348,-822"/>
<polygon fill="none" stroke="#000000" points="133.348,-790 133.348,-822 204.348,-822 204.348,-790 133.348,-790"/>
<text text-anchor="start" x="150.787" y="-803" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__iter__</text>
</g>
<!-- A3 -->
<g id="node4" class="node">
<title>A3</title>
<polygon fill="none" stroke="#000000" points="150.5,-1590 150.5,-1622 446.5,-1622 446.5,-1590 150.5,-1590"/>
<text text-anchor="start" x="281.5535" y="-1603" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Inverter</text>
<polygon fill="none" stroke="#000000" points="150.5,-1474 150.5,-1590 446.5,-1590 446.5,-1474 150.5,-1474"/>
<text text-anchor="start" x="274.604" y="-1571" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.db_stat</text>
<text text-anchor="start" x="267.9405" y="-1559" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.entity_prfx</text>
<text text-anchor="start" x="258.7755" y="-1547" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.discovery_prfx</text>
<text text-anchor="start" x="258.2115" y="-1535" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.proxy_node_id</text>
<text text-anchor="start" x="254.3225" y="-1523" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.proxy_unique_id</text>
<text text-anchor="start" x="270.1655" y="-1511" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.mqtt:Mqtt</text>
<text text-anchor="start" x="267.9355" y="-1487" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__ha_restarts</text>
<polygon fill="none" stroke="#000000" points="150.5,-1442 150.5,-1474 446.5,-1474 446.5,-1442 150.5,-1442"/>
<text text-anchor="start" x="160.418" y="-1455" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote(inv_prot, conn_class)async_publ_mqtt()</text>
<polygon fill="none" stroke="#000000" points="20.348,-708 20.348,-740 316.348,-740 316.348,-708 20.348,-708"/>
<text text-anchor="start" x="151.4015" y="-721" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Inverter</text>
<polygon fill="none" stroke="#000000" points="20.348,-592 20.348,-708 316.348,-708 316.348,-592 20.348,-592"/>
<text text-anchor="start" x="144.452" y="-689" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.db_stat</text>
<text text-anchor="start" x="137.7885" y="-677" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.entity_prfx</text>
<text text-anchor="start" x="128.6235" y="-665" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.discovery_prfx</text>
<text text-anchor="start" x="128.0595" y="-653" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.proxy_node_id</text>
<text text-anchor="start" x="124.1705" y="-641" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.proxy_unique_id</text>
<text text-anchor="start" x="140.0135" y="-629" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.mqtt:Mqtt</text>
<text text-anchor="start" x="137.7835" y="-605" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__ha_restarts</text>
<polygon fill="none" stroke="#000000" points="20.348,-560 20.348,-592 316.348,-592 316.348,-560 20.348,-560"/>
<text text-anchor="start" x="30.266" y="-573" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote(inv_prot, conn_class)async_publ_mqtt()</text>
</g>
<!-- A1&#45;&gt;A3 -->
<g id="edge5" class="edge">
<title>A1&#45;&gt;A3</title>
<path fill="none" stroke="#000000" d="M413.9036,-1699.7199C398.0565,-1676.6887 378.7787,-1648.6717 360.5529,-1622.1835"/>
<polygon fill="none" stroke="#000000" points="411.0266,-1701.7132 419.5785,-1707.9674 416.7933,-1697.7452 411.0266,-1701.7132"/>
</g>
<!-- A18 -->
<g id="node19" class="node">
<title>A18</title>
<polygon fill="none" stroke="#000000" points="558.5,-1554 558.5,-1586 639.5,-1586 639.5,-1554 558.5,-1554"/>
<text text-anchor="start" x="578.7175" y="-1567" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Message</text>
<polygon fill="none" stroke="#000000" points="558.5,-1522 558.5,-1554 639.5,-1554 639.5,-1522 558.5,-1522"/>
<text text-anchor="start" x="581.2135" y="-1535" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">node_id</text>
<polygon fill="none" stroke="#000000" points="558.5,-1478 558.5,-1522 639.5,-1522 639.5,-1478 558.5,-1478"/>
<text text-anchor="start" x="569.8305" y="-1503" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">inc_counter()</text>
<text text-anchor="start" x="568.1605" y="-1491" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dec_counter()</text>
</g>
<!-- A1&#45;&gt;A18 -->
<g id="edge25" class="edge">
<title>A1&#45;&gt;A18</title>
<path fill="none" stroke="#000000" d="M492.1048,-1717.9107C511.7288,-1701.7077 533.9297,-1680.6887 549.5,-1658 564.3743,-1636.3255 575.6125,-1609.499 583.5491,-1586.1771"/>
<polygon fill="none" stroke="#000000" points="489.7437,-1715.3186 484.1644,-1724.3254 494.1426,-1720.7638 489.7437,-1715.3186"/>
<path fill="none" stroke="#000000" d="M168.348,-779.6728C168.348,-767.2695 168.348,-753.6887 168.348,-740.1336"/>
<polygon fill="none" stroke="#000000" points="164.8481,-779.7881 168.348,-789.7881 171.8481,-779.7881 164.8481,-779.7881"/>
</g>
<!-- A2 -->
<g id="node3" class="node">
<title>A2</title>
<polygon fill="none" stroke="#000000" points="304.5,-1228 304.5,-1272 426.5,-1272 426.5,-1228 304.5,-1228"/>
<text text-anchor="start" x="355.777" y="-1253" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Mqtt</text>
<text text-anchor="start" x="332.9815" y="-1241" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;&lt;Singleton&gt;&gt;</text>
<polygon fill="none" stroke="#000000" points="304.5,-1172 304.5,-1228 426.5,-1228 426.5,-1172 304.5,-1172"/>
<text text-anchor="start" x="322.9875" y="-1209" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;static&gt;ha_restarts</text>
<text text-anchor="start" x="330.7665" y="-1197" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;static&gt;__client</text>
<text text-anchor="start" x="314.3735" y="-1185" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;static&gt;__cb_MqttIsUp</text>
<polygon fill="none" stroke="#000000" points="304.5,-1128 304.5,-1172 426.5,-1172 426.5,-1128 304.5,-1128"/>
<text text-anchor="start" x="327.436" y="-1153" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;publish()</text>
<text text-anchor="start" x="331.6045" y="-1141" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;close()</text>
<polygon fill="none" stroke="#000000" points="27.348,-466 27.348,-510 149.348,-510 149.348,-466 27.348,-466"/>
<text text-anchor="start" x="78.625" y="-491" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Mqtt</text>
<text text-anchor="start" x="55.8295" y="-479" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;&lt;Singleton&gt;&gt;</text>
<polygon fill="none" stroke="#000000" points="27.348,-410 27.348,-466 149.348,-466 149.348,-410 27.348,-410"/>
<text text-anchor="start" x="45.8355" y="-447" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;static&gt;ha_restarts</text>
<text text-anchor="start" x="53.6145" y="-435" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;static&gt;__client</text>
<text text-anchor="start" x="37.2215" y="-423" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;static&gt;__cb_MqttIsUp</text>
<polygon fill="none" stroke="#000000" points="27.348,-366 27.348,-410 149.348,-410 149.348,-366 27.348,-366"/>
<text text-anchor="start" x="50.284" y="-391" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;publish()</text>
<text text-anchor="start" x="54.4525" y="-379" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;close()</text>
</g>
<!-- A3&#45;&gt;A2 -->
<g id="edge4" class="edge">
<title>A3&#45;&gt;A2</title>
<path fill="none" stroke="#000000" d="M319.1555,-1429.6474C328.7234,-1382.2362 339.9387,-1326.6622 348.9397,-1282.0602"/>
<polygon fill="#000000" stroke="#000000" points="319.0935,-1429.9552 321.8275,-1436.6279 316.7195,-1441.7181 313.9855,-1435.0453 319.0935,-1429.9552"/>
<polygon fill="#000000" stroke="#000000" points="350.9422,-1272.137 353.375,-1282.8296 349.9531,-1277.0382 348.964,-1281.9393 348.964,-1281.9393 348.964,-1281.9393 349.9531,-1277.0382 344.5529,-1281.0491 350.9422,-1272.137 350.9422,-1272.137"/>
<path fill="none" stroke="#000000" d="M130.0325,-548.4638C126.3726,-538.7653 122.694,-529.0169 119.1193,-519.544"/>
<polygon fill="#000000" stroke="#000000" points="130.068,-548.5583 135.9288,-552.7596 134.3048,-559.7855 128.444,-555.5841 130.068,-548.5583"/>
<polygon fill="#000000" stroke="#000000" points="115.5839,-510.1751 123.3248,-517.9424 117.3492,-514.8532 119.1145,-519.5312 119.1145,-519.5312 119.1145,-519.5312 117.3492,-514.8532 114.9043,-521.12 115.5839,-510.1751 115.5839,-510.1751"/>
</g>
<!-- A4 -->
<g id="node5" class="node">
<title>A4</title>
<polygon fill="none" stroke="#000000" points="125.5,-1222 125.5,-1254 286.5,-1254 286.5,-1222 125.5,-1222"/>
<text text-anchor="start" x="177.66" y="-1235" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InverterBase</text>
<polygon fill="none" stroke="#000000" points="125.5,-1202 125.5,-1222 286.5,-1222 286.5,-1202 125.5,-1202"/>
<polygon fill="none" stroke="#000000" points="125.5,-1146 125.5,-1202 286.5,-1202 286.5,-1146 125.5,-1146"/>
<text text-anchor="start" x="135.426" y="-1183" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;disc(shutdown_started)</text>
<text text-anchor="start" x="135.7055" y="-1171" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;async_create_remote()</text>
<text text-anchor="start" x="186.554" y="-1159" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<polygon fill="none" stroke="#000000" points="168.348,-460 168.348,-492 329.348,-492 329.348,-460 168.348,-460"/>
<text text-anchor="start" x="220.508" y="-473" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InverterBase</text>
<polygon fill="none" stroke="#000000" points="168.348,-440 168.348,-460 329.348,-460 329.348,-440 168.348,-440"/>
<polygon fill="none" stroke="#000000" points="168.348,-384 168.348,-440 329.348,-440 329.348,-384 168.348,-384"/>
<text text-anchor="start" x="178.274" y="-421" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;disc(shutdown_started)</text>
<text text-anchor="start" x="178.5535" y="-409" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;async_create_remote()</text>
<text text-anchor="start" x="229.402" y="-397" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
</g>
<!-- A3&#45;&gt;A4 -->
<g id="edge1" class="edge">
<title>A3&#45;&gt;A4</title>
<path fill="none" stroke="#000000" d="M270.4168,-1431.746C254.1017,-1373.5028 234.1788,-1302.3802 220.7415,-1254.4107"/>
<polygon fill="none" stroke="#000000" points="267.1425,-1433.0328 273.2102,-1441.7181 273.883,-1431.1446 267.1425,-1433.0328"/>
<path fill="none" stroke="#000000" d="M205.9667,-550.3105C213.5193,-530.2961 221.1855,-509.9807 227.8831,-492.2319"/>
<polygon fill="none" stroke="#000000" points="202.6472,-549.1938 202.3912,-559.7855 209.1964,-551.6652 202.6472,-549.1938"/>
</g>
<!-- A5 -->
<g id="node6" class="node">
<title>A5</title>
<polygon fill="none" stroke="#000000" points="290.5,-860 290.5,-892 412.5,-892 412.5,-860 290.5,-860"/>
<text text-anchor="start" x="327.8845" y="-873" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InverterG3</text>
<polygon fill="none" stroke="#000000" points="290.5,-804 290.5,-860 412.5,-860 412.5,-804 290.5,-804"/>
<text text-anchor="start" x="341.497" y="-841" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="312.053" y="-829" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote:StreamPtr</text>
<text text-anchor="start" x="317.332" y="-817" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local:StreamPtr</text>
<polygon fill="none" stroke="#000000" points="290.5,-748 290.5,-804 412.5,-804 412.5,-748 290.5,-748"/>
<text text-anchor="start" x="300.1035" y="-785" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote()</text>
<text text-anchor="start" x="336.5025" y="-761" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<polygon fill="none" stroke="#000000" points="187.348,-284 187.348,-316 309.348,-316 309.348,-284 187.348,-284"/>
<text text-anchor="start" x="224.7325" y="-297" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InverterG3</text>
<polygon fill="none" stroke="#000000" points="187.348,-228 187.348,-284 309.348,-284 309.348,-228 187.348,-228"/>
<text text-anchor="start" x="238.345" y="-265" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="208.901" y="-253" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote:StreamPtr</text>
<text text-anchor="start" x="214.18" y="-241" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local:StreamPtr</text>
<polygon fill="none" stroke="#000000" points="187.348,-172 187.348,-228 309.348,-228 309.348,-172 187.348,-172"/>
<text text-anchor="start" x="196.9515" y="-209" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote()</text>
<text text-anchor="start" x="233.3505" y="-185" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A4&#45;&gt;A5 -->
<g id="edge2" class="edge">
<title>A4&#45;&gt;A5</title>
<path fill="none" stroke="#000000" d="M229.9763,-1136.2945C255.9003,-1068.8213 296.7461,-962.5101 323.8242,-892.0328"/>
<polygon fill="none" stroke="#000000" points="226.5826,-1135.3688 226.2632,-1145.9588 233.1169,-1137.8794 226.5826,-1135.3688"/>
<path fill="none" stroke="#000000" d="M248.348,-373.9068C248.348,-355.4405 248.348,-335.1691 248.348,-316.2449"/>
<polygon fill="none" stroke="#000000" points="244.8481,-373.9601 248.348,-383.9602 251.8481,-373.9602 244.8481,-373.9601"/>
</g>
<!-- A6 -->
<g id="node7" class="node">
<title>A6</title>
<polygon fill="none" stroke="#000000" points="150.5,-860 150.5,-892 272.5,-892 272.5,-860 150.5,-860"/>
<text text-anchor="start" x="184.55" y="-873" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InverterG3P</text>
<polygon fill="none" stroke="#000000" points="150.5,-804 150.5,-860 272.5,-860 272.5,-804 150.5,-804"/>
<text text-anchor="start" x="201.497" y="-841" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="172.053" y="-829" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote:StreamPtr</text>
<text text-anchor="start" x="177.332" y="-817" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local:StreamPtr</text>
<polygon fill="none" stroke="#000000" points="150.5,-748 150.5,-804 272.5,-804 272.5,-748 150.5,-748"/>
<text text-anchor="start" x="160.1035" y="-785" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote()</text>
<text text-anchor="start" x="196.5025" y="-761" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<polygon fill="none" stroke="#000000" points="333.348,-284 333.348,-316 455.348,-316 455.348,-284 333.348,-284"/>
<text text-anchor="start" x="367.398" y="-297" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InverterG3P</text>
<polygon fill="none" stroke="#000000" points="333.348,-228 333.348,-284 455.348,-284 455.348,-228 333.348,-228"/>
<text text-anchor="start" x="384.345" y="-265" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="354.901" y="-253" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote:StreamPtr</text>
<text text-anchor="start" x="360.18" y="-241" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local:StreamPtr</text>
<polygon fill="none" stroke="#000000" points="333.348,-172 333.348,-228 455.348,-228 455.348,-172 333.348,-172"/>
<text text-anchor="start" x="342.9515" y="-209" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote()</text>
<text text-anchor="start" x="379.3505" y="-185" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A4&#45;&gt;A6 -->
<g id="edge3" class="edge">
<title>A4&#45;&gt;A6</title>
<path fill="none" stroke="#000000" d="M206.5124,-1135.8792C207.5781,-1068.3857 209.2521,-962.3657 210.3626,-892.0328"/>
<polygon fill="none" stroke="#000000" points="203.0117,-1135.9048 206.3533,-1145.9588 210.0108,-1136.0154 203.0117,-1135.9048"/>
</g>
<!-- A10 -->
<g id="node11" class="node">
<title>A10</title>
<polygon fill="none" stroke="#000000" points="310.5,-100 310.5,-132 488.5,-132 488.5,-100 310.5,-100"/>
<text text-anchor="start" x="355.0515" y="-113" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStreamServer</text>
<polygon fill="none" stroke="#000000" points="310.5,-68 310.5,-100 488.5,-100 488.5,-68 310.5,-68"/>
<text text-anchor="start" x="351.4325" y="-81" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote</text>
<polygon fill="none" stroke="#000000" points="310.5,0 310.5,-68 488.5,-68 488.5,0 310.5,0"/>
<text text-anchor="start" x="351.1575" y="-49" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;server_loop()</text>
<text text-anchor="start" x="341.9885" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;_async_forward()</text>
<text text-anchor="start" x="320.309" y="-25" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;publish_outstanding_mqtt()</text>
<text text-anchor="start" x="384.5025" y="-13" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A5&#45;&gt;A10 -->
<g id="edge13" class="edge">
<title>A5&#45;&gt;A10</title>
<path fill="none" stroke="#000000" d="M348.2697,-735.5916C344.8762,-613.0113 343.2848,-378.8606 370.5,-182 372.3009,-168.9729 374.9865,-155.2896 378.0085,-142.0725"/>
<polygon fill="#000000" stroke="#000000" points="348.2763,-735.8253 352.4488,-741.7067 348.6246,-747.8203 344.4521,-741.9389 348.2763,-735.8253"/>
<polygon fill="#000000" stroke="#000000" points="380.376,-132.0749 382.4505,-142.8427 379.2238,-136.9403 378.0716,-141.8057 378.0716,-141.8057 378.0716,-141.8057 379.2238,-136.9403 373.6927,-140.7688 380.376,-132.0749 380.376,-132.0749"/>
<text text-anchor="middle" x="339.6499" y="-726.947" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local</text>
</g>
<!-- A11 -->
<g id="node12" class="node">
<title>A11</title>
<polygon fill="none" stroke="#000000" points="154.5,-82 154.5,-114 292.5,-114 292.5,-82 154.5,-82"/>
<text text-anchor="start" x="180.997" y="-95" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStreamClient</text>
<polygon fill="none" stroke="#000000" points="154.5,-62 154.5,-82 292.5,-82 292.5,-62 154.5,-62"/>
<polygon fill="none" stroke="#000000" points="154.5,-18 154.5,-62 292.5,-62 292.5,-18 154.5,-18"/>
<text text-anchor="start" x="177.378" y="-43" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;client_loop()</text>
<text text-anchor="start" x="164.324" y="-31" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;_async_forward())</text>
</g>
<!-- A5&#45;&gt;A11 -->
<g id="edge11" class="edge">
<title>A5&#45;&gt;A11</title>
<path fill="none" stroke="#000000" d="M339.2268,-747.7033C313.9489,-598.8003 256.5152,-260.4801 233.4051,-124.3474"/>
<polygon fill="#000000" stroke="#000000" points="231.67,-114.1263 237.7803,-123.2321 232.5069,-119.0558 233.3437,-123.9853 233.3437,-123.9853 233.3437,-123.9853 232.5069,-119.0558 228.9072,-124.7385 231.67,-114.1263 231.67,-114.1263"/>
<text text-anchor="middle" x="243.0368" y="-127.5822" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote</text>
</g>
<!-- A6&#45;&gt;A10 -->
<g id="edge17" class="edge">
<title>A6&#45;&gt;A10</title>
<path fill="none" stroke="#000000" d="M223.2527,-735.8807C241.8596,-612.3455 282.6734,-375.5434 346.5,-182 350.8803,-168.7174 356.3259,-154.927 362.0443,-141.6882"/>
<polygon fill="#000000" stroke="#000000" points="223.2394,-735.9707 226.3097,-742.4955 221.4678,-747.8392 218.3974,-741.3144 223.2394,-735.9707"/>
<polygon fill="#000000" stroke="#000000" points="366.2451,-132.1609 366.3281,-143.1265 364.2279,-136.7359 362.2106,-141.3109 362.2106,-141.3109 362.2106,-141.3109 364.2279,-136.7359 358.0931,-139.4954 366.2451,-132.1609 366.2451,-132.1609"/>
<text text-anchor="middle" x="215.7839" y="-725.6638" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local</text>
</g>
<!-- A6&#45;&gt;A11 -->
<g id="edge15" class="edge">
<title>A6&#45;&gt;A11</title>
<path fill="none" stroke="#000000" d="M212.6506,-747.7033C215.0204,-598.8003 220.4048,-260.4801 222.5714,-124.3474"/>
<polygon fill="#000000" stroke="#000000" points="222.7341,-114.1263 227.0743,-124.1967 222.6544,-119.1257 222.5748,-124.1251 222.5748,-124.1251 222.5748,-124.1251 222.6544,-119.1257 218.0754,-124.0534 222.7341,-114.1263 222.7341,-114.1263"/>
<text text-anchor="middle" x="230.8969" y="-129.3847" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote</text>
<path fill="none" stroke="#000000" d="M295.0446,-375.9511C309.349,-356.9439 325.2087,-335.87 339.9781,-316.2449"/>
<polygon fill="none" stroke="#000000" points="292.2338,-373.8654 289.0171,-383.9602 297.8269,-378.0747 292.2338,-373.8654"/>
</g>
<!-- A7 -->
<g id="node8" class="node">
<title>A7</title>
<polygon fill="none" stroke="#000000" points="431.5,-962 431.5,-994 548.5,-994 548.5,-962 431.5,-962"/>
<text text-anchor="start" x="459.429" y="-975" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;&lt;AsyncIfc&gt;&gt;</text>
<polygon fill="none" stroke="#000000" points="431.5,-942 431.5,-962 548.5,-962 548.5,-942 431.5,-942"/>
<polygon fill="none" stroke="#000000" points="431.5,-646 431.5,-942 548.5,-942 548.5,-646 431.5,-646"/>
<text text-anchor="start" x="459.436" y="-923" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">set_node_id()</text>
<text text-anchor="start" x="457.766" y="-911" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">get_conn_no()</text>
<text text-anchor="start" x="471.6635" y="-887" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_add()</text>
<text text-anchor="start" x="469.444" y="-875" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_flush()</text>
<text text-anchor="start" x="473.0535" y="-863" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_get()</text>
<text text-anchor="start" x="469.1635" y="-851" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_peek()</text>
<text text-anchor="start" x="473.3335" y="-839" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_log()</text>
<text text-anchor="start" x="469.169" y="-827" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_clear()</text>
<text text-anchor="start" x="473.3335" y="-815" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_len()</text>
<text text-anchor="start" x="467.7745" y="-791" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_add()</text>
<text text-anchor="start" x="465.555" y="-779" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_flush()</text>
<text text-anchor="start" x="469.4445" y="-767" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_log()</text>
<text text-anchor="start" x="465.28" y="-755" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_clear()</text>
<text text-anchor="start" x="472.7785" y="-743" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_get()</text>
<text text-anchor="start" x="468.8885" y="-731" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_peek()</text>
<text text-anchor="start" x="473.0585" y="-719" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_log()</text>
<text text-anchor="start" x="468.894" y="-707" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_clear()</text>
<text text-anchor="start" x="473.0585" y="-695" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_len()</text>
<text text-anchor="start" x="464.999" y="-683" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_set_cb()</text>
<text text-anchor="start" x="441.3795" y="-659" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">prot_set_timeout_cb()</text>
<polygon fill="none" stroke="#000000" points="362.9901,-36 273.7059,-36 273.7059,0 362.9901,0 362.9901,-36"/>
<text text-anchor="middle" x="318.348" y="-15" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;&lt;AsyncIfc&gt;&gt;</text>
</g>
<!-- A5&#45;&gt;A7 -->
<g id="edge7" class="edge">
<title>A5&#45;&gt;A7</title>
<path fill="none" stroke="#000000" d="M240.5289,-171.6857C240.2064,-143.9437 243.216,-112.5864 254.348,-86 261.2443,-69.5295 274.0532,-54.6444 286.4105,-43.0292"/>
<polygon fill="#000000" stroke="#000000" points="293.9894,-36.2348 289.5473,-46.2607 290.2664,-39.5724 286.5434,-42.91 286.5434,-42.91 286.5434,-42.91 290.2664,-39.5724 283.5396,-39.5594 293.9894,-36.2348 293.9894,-36.2348"/>
<text text-anchor="middle" x="286.135" y="-51.6279" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1..2</text>
</g>
<!-- A8 -->
<g id="node9" class="node">
<title>A8</title>
<polygon fill="none" stroke="#000000" points="413.5,-564 413.5,-596 506.5,-596 506.5,-564 413.5,-564"/>
<text text-anchor="start" x="431.664" y="-577" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncIfcImpl</text>
<polygon fill="none" stroke="#000000" points="413.5,-472 413.5,-564 506.5,-564 506.5,-472 413.5,-472"/>
<text text-anchor="start" x="423.048" y="-545" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_fifo:ByteFifo</text>
<text text-anchor="start" x="426.937" y="-533" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_fifo:ByteFifo</text>
<text text-anchor="start" x="426.662" y="-521" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_fifo:ByteFifo</text>
<text text-anchor="start" x="426.096" y="-509" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">conn_no:Count</text>
<text text-anchor="start" x="442.2135" y="-497" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">node_id</text>
<text text-anchor="start" x="435.5495" y="-485" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">timeout_cb</text>
<polygon fill="none" stroke="#000000" points="373.6053,-122 263.0907,-122 263.0907,-86 373.6053,-86 373.6053,-122"/>
<text text-anchor="middle" x="318.348" y="-101" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;&lt;MessageProt&gt;&gt;</text>
</g>
<!-- A7&#45;&gt;A8 -->
<!-- A5&#45;&gt;A8 -->
<g id="edge6" class="edge">
<title>A7&#45;&gt;A8</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M470.1541,-635.5689C468.6931,-621.6405 467.2922,-608.286 466.014,-596.0997"/>
<polygon fill="none" stroke="#000000" points="466.7035,-636.2236 471.2277,-645.8038 473.6653,-635.4932 466.7035,-636.2236"/>
<title>A5&#45;&gt;A8</title>
<path fill="none" stroke="#000000" d="M284.3733,-171.9495C291.5966,-157.5029 298.7616,-143.1729 304.6363,-131.4235"/>
<polygon fill="#000000" stroke="#000000" points="309.2405,-122.215 308.7932,-133.1718 307.0044,-126.6872 304.7683,-131.1593 304.7683,-131.1593 304.7683,-131.1593 307.0044,-126.6872 300.7434,-129.1468 309.2405,-122.215 309.2405,-122.215"/>
<text text-anchor="middle" x="308.6942" y="-139.2076" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1..2</text>
</g>
<!-- A6&#45;&gt;A7 -->
<g id="edge9" class="edge">
<title>A6&#45;&gt;A7</title>
<path fill="none" stroke="#000000" d="M398.9275,-171.9166C398.1587,-144.0552 394.0617,-112.5537 382.348,-86 375.087,-69.5402 362.0955,-54.573 349.7057,-42.8973"/>
<polygon fill="#000000" stroke="#000000" points="342.1257,-36.0689 352.5675,-39.4186 345.8407,-39.4154 349.5556,-42.762 349.5556,-42.762 349.5556,-42.762 345.8407,-39.4154 346.5437,-46.1054 342.1257,-36.0689 342.1257,-36.0689"/>
<text text-anchor="middle" x="361.2504" y="-38.921" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1..2</text>
</g>
<!-- A6&#45;&gt;A8 -->
<g id="edge8" class="edge">
<title>A6&#45;&gt;A8</title>
<path fill="none" stroke="#000000" d="M355.2349,-171.9495C347.314,-157.3584 339.4577,-142.8863 333.0441,-131.0718"/>
<polygon fill="#000000" stroke="#000000" points="328.2362,-122.215 336.962,-128.8567 330.6217,-126.6093 333.0071,-131.0036 333.0071,-131.0036 333.0071,-131.0036 330.6217,-126.6093 329.0523,-133.1505 328.2362,-122.215 328.2362,-122.215"/>
<text text-anchor="middle" x="344.3124" y="-131.1127" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1..2</text>
</g>
<!-- A8&#45;&gt;A7 -->
<g id="edge10" class="edge">
<title>A8&#45;&gt;A7</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M318.348,-85.7616C318.348,-74.3597 318.348,-59.4342 318.348,-46.494"/>
<polygon fill="#000000" stroke="#000000" points="318.348,-36.2121 322.8481,-46.2121 318.348,-41.2121 318.3481,-46.2121 318.3481,-46.2121 318.3481,-46.2121 318.348,-41.2121 313.8481,-46.2121 318.348,-36.2121 318.348,-36.2121"/>
<text text-anchor="middle" x="309.8956" y="-64.6355" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">use</text>
</g>
<!-- A9 -->
<g id="node10" class="node">
<title>A9</title>
<polygon fill="none" stroke="#000000" points="379.5,-390 379.5,-422 481.5,-422 481.5,-390 379.5,-390"/>
<text text-anchor="start" x="400.774" y="-403" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStream</text>
<polygon fill="none" stroke="#000000" points="379.5,-310 379.5,-390 481.5,-390 481.5,-310 379.5,-310"/>
<text text-anchor="start" x="416.053" y="-371" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">reader</text>
<text text-anchor="start" x="418.283" y="-359" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">writer</text>
<text text-anchor="start" x="420.497" y="-347" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="416.053" y="-335" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">r_addr</text>
<text text-anchor="start" x="416.608" y="-323" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">l_addr</text>
<polygon fill="none" stroke="#000000" points="379.5,-182 379.5,-310 481.5,-310 481.5,-182 379.5,-182"/>
<text text-anchor="start" x="402.154" y="-279" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;loop</text>
<text text-anchor="start" x="418.282" y="-267" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">disc()</text>
<text text-anchor="start" x="415.5025" y="-255" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<text text-anchor="start" x="411.054" y="-243" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<text text-anchor="start" x="395.7705" y="-219" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__async_read()</text>
<text text-anchor="start" x="395.221" y="-207" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__async_write()</text>
<text text-anchor="start" x="389.107" y="-195" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__async_forward()</text>
<polygon fill="none" stroke="#000000" points="347.348,-466 347.348,-498 454.348,-498 454.348,-466 347.348,-466"/>
<text text-anchor="start" x="371.1175" y="-479" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ModbusConn</text>
<polygon fill="none" stroke="#000000" points="347.348,-398 347.348,-466 454.348,-466 454.348,-398 347.348,-398"/>
<text text-anchor="start" x="391.3995" y="-447" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">host</text>
<text text-anchor="start" x="392.235" y="-435" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">port</text>
<text text-anchor="start" x="390.845" y="-423" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="357.231" y="-411" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">stream:InverterG3P</text>
<polygon fill="none" stroke="#000000" points="347.348,-378 347.348,-398 454.348,-398 454.348,-378 347.348,-378"/>
</g>
<!-- A8&#45;&gt;A9 -->
<g id="edge7" class="edge">
<title>A8&#45;&gt;A9</title>
<path fill="none" stroke="#000000" d="M450.4821,-461.8566C448.8983,-449.1863 447.2122,-435.6974 445.5166,-422.1331"/>
<polygon fill="none" stroke="#000000" points="447.0151,-462.3396 451.7285,-471.8283 453.9611,-461.4713 447.0151,-462.3396"/>
</g>
<!-- A9&#45;&gt;A10 -->
<g id="edge8" class="edge">
<title>A9&#45;&gt;A10</title>
<path fill="none" stroke="#000000" d="M413.4152,-171.9352C411.618,-158.2531 409.8495,-144.7897 408.2077,-132.2911"/>
<polygon fill="none" stroke="#000000" points="409.9549,-172.4669 414.7276,-181.9259 416.8953,-171.5552 409.9549,-172.4669"/>
</g>
<!-- A9&#45;&gt;A11 -->
<g id="edge9" class="edge">
<title>A9&#45;&gt;A11</title>
<path fill="none" stroke="#000000" d="M372.6557,-236.0519C338.7013,-197.3406 296.5482,-149.282 265.7249,-114.1405"/>
<polygon fill="none" stroke="#000000" points="370.1061,-238.4529 379.3314,-243.6629 375.3686,-233.8371 370.1061,-238.4529"/>
</g>
<!-- A12 -->
<g id="node13" class="node">
<title>A12</title>
<polygon fill="none" stroke="#000000" points="554.5,-1324 554.5,-1356 668.5,-1356 668.5,-1324 554.5,-1324"/>
<text text-anchor="start" x="597.608" y="-1337" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Talent</text>
<polygon fill="none" stroke="#000000" points="554.5,-1172 554.5,-1324 668.5,-1324 668.5,-1172 554.5,-1172"/>
<text text-anchor="start" x="586.2185" y="-1305" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ifc:AsyncIfc</text>
<text text-anchor="start" x="592.323" y="-1293" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">conn_no</text>
<text text-anchor="start" x="601.497" y="-1281" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="564.263" y="-1257" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">await_conn_resp_cnt</text>
<text text-anchor="start" x="599.2775" y="-1245" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">id_str</text>
<text text-anchor="start" x="580.1" y="-1233" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">contact_name</text>
<text text-anchor="start" x="583.44" y="-1221" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">contact_mail</text>
<text text-anchor="start" x="587.0445" y="-1209" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:InfosG3</text>
<text text-anchor="start" x="585.384" y="-1197" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">mb:Modbus</text>
<text text-anchor="start" x="597.612" y="-1185" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">switch</text>
<polygon fill="none" stroke="#000000" points="554.5,-1044 554.5,-1172 668.5,-1172 668.5,-1044 554.5,-1044"/>
<text text-anchor="start" x="568.9925" y="-1153" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_contact_info()</text>
<text text-anchor="start" x="570.9325" y="-1141" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_ota_update()</text>
<text text-anchor="start" x="576.7765" y="-1129" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_get_time()</text>
<text text-anchor="start" x="564.8285" y="-1117" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_collector_data()</text>
<text text-anchor="start" x="566.7735" y="-1105" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_inverter_data()</text>
<text text-anchor="start" x="575.9405" y="-1093" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_unknown()</text>
<text text-anchor="start" x="592.054" y="-1069" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<text text-anchor="start" x="596.5025" y="-1057" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A12&#45;&gt;A5 -->
<g id="edge10" class="edge">
<title>A12&#45;&gt;A5</title>
<path fill="none" stroke="#000000" d="M548.4275,-1057.3616C544.6954,-1052.6454 540.7258,-1048.1664 536.5,-1044 494.4791,-1002.5691 455.2545,-1035.6993 413.5,-994 385.9127,-966.4492 368.6099,-926.7051 358.9167,-892.1547"/>
<polygon fill="#000000" stroke="#000000" points="554.4873,-1065.5095 544.9087,-1060.1709 551.5034,-1061.4974 548.5196,-1057.4854 548.5196,-1057.4854 548.5196,-1057.4854 551.5034,-1061.4974 552.1304,-1054.7999 554.4873,-1065.5095 554.4873,-1065.5095"/>
<text text-anchor="middle" x="536.8879" y="-1053.009" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote</text>
</g>
<!-- A12&#45;&gt;A5 -->
<g id="edge12" class="edge">
<title>A12&#45;&gt;A5</title>
<path fill="none" stroke="#000000" d="M546.1946,-1036.7124C507.2777,-1006.6255 470.4919,-1032.9404 431.5,-994 406.9301,-969.4625 390.5179,-935.2533 379.0804,-903.6552"/>
<polygon fill="#000000" stroke="#000000" points="554.0077,-1043.5179 543.5114,-1040.343 550.2374,-1040.2338 546.4671,-1036.9498 546.4671,-1036.9498 546.4671,-1036.9498 550.2374,-1040.2338 549.4228,-1033.5565 554.0077,-1043.5179 554.0077,-1043.5179"/>
<polygon fill="#000000" stroke="#000000" points="379.0233,-903.4904 373.276,-899.135 375.0858,-892.1547 380.8331,-896.5101 379.0233,-903.4904"/>
<text text-anchor="middle" x="389.0177" y="-903.504" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local</text>
</g>
<!-- A12&#45;&gt;A7 -->
<g id="edge21" class="edge">
<title>A12&#45;&gt;A7</title>
<path fill="none" stroke="#000000" d="M561.3498,-1043.7944C557.119,-1030.6165 552.8162,-1017.2145 548.5265,-1003.853"/>
<polygon fill="#000000" stroke="#000000" points="545.4064,-994.1348 552.7479,-1002.2805 546.9349,-998.8955 548.4633,-1003.6561 548.4633,-1003.6561 548.4633,-1003.6561 546.9349,-998.8955 544.1787,-1005.0317 545.4064,-994.1348 545.4064,-994.1348"/>
<text text-anchor="middle" x="547.7611" y="-1026.1197" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">use</text>
</g>
<!-- A15 -->
<g id="node16" class="node">
<title>A15</title>
<polygon fill="none" stroke="#000000" points="760.5,-836 760.5,-868 827.5,-868 827.5,-836 760.5,-836"/>
<text text-anchor="start" x="776.493" y="-849" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InfosG3</text>
<polygon fill="none" stroke="#000000" points="760.5,-816 760.5,-836 827.5,-836 827.5,-816 760.5,-816"/>
<polygon fill="none" stroke="#000000" points="760.5,-772 760.5,-816 827.5,-816 827.5,-772 760.5,-772"/>
<text text-anchor="start" x="770.384" y="-797" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_confs()</text>
<text text-anchor="start" x="778.168" y="-785" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">parse()</text>
</g>
<!-- A12&#45;&gt;A15 -->
<g id="edge22" class="edge">
<title>A12&#45;&gt;A15</title>
<path fill="none" stroke="#000000" d="M668.6022,-1099.9846C680.5115,-1080.974 693.4351,-1061.5511 706.5,-1044 724.352,-1020.0181 737.5662,-1020.4514 751.5,-994 770.4821,-957.965 781.0364,-913.2207 786.817,-878.1298"/>
<polygon fill="#000000" stroke="#000000" points="788.3928,-868.0379 791.2961,-878.6125 787.6214,-872.9781 786.8499,-877.9182 786.8499,-877.9182 786.8499,-877.9182 787.6214,-872.9781 782.4038,-877.2239 788.3928,-868.0379 788.3928,-868.0379"/>
</g>
<!-- A17 -->
<g id="node18" class="node">
<title>A17</title>
<polygon fill="none" stroke="#000000" points="657.409,-838 565.591,-838 565.591,-802 657.409,-802 657.409,-838"/>
<text text-anchor="middle" x="611.5" y="-817" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3</text>
</g>
<!-- A12&#45;&gt;A17 -->
<g id="edge20" class="edge">
<title>A12&#45;&gt;A17</title>
<path fill="none" stroke="#000000" d="M611.5,-1033.4357C611.5,-956.2599 611.5,-873.846 611.5,-838.1787"/>
<polygon fill="none" stroke="#000000" points="608.0001,-1033.7944 611.5,-1043.7944 615.0001,-1033.7945 608.0001,-1033.7944"/>
</g>
<!-- A13 -->
<g id="node14" class="node">
<title>A13</title>
<polygon fill="none" stroke="#000000" points="445.5,-1288 445.5,-1320 536.5,-1320 536.5,-1288 445.5,-1288"/>
<text text-anchor="start" x="463.495" y="-1301" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">SolarmanV5</text>
<polygon fill="none" stroke="#000000" points="445.5,-1148 445.5,-1288 536.5,-1288 536.5,-1148 445.5,-1148"/>
<text text-anchor="start" x="465.7185" y="-1269" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ifc:AsyncIfc</text>
<text text-anchor="start" x="471.823" y="-1257" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">conn_no</text>
<text text-anchor="start" x="480.997" y="-1245" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="475.998" y="-1221" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">control</text>
<text text-anchor="start" x="479.0575" y="-1209" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">serial</text>
<text text-anchor="start" x="484.056" y="-1197" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">snr</text>
<text text-anchor="start" x="463.21" y="-1185" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:InfosG3P</text>
<text text-anchor="start" x="464.884" y="-1173" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">mb:Modbus</text>
<text text-anchor="start" x="477.112" y="-1161" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">switch</text>
<polygon fill="none" stroke="#000000" points="445.5,-1080 445.5,-1148 536.5,-1148 536.5,-1080 445.5,-1080"/>
<text text-anchor="start" x="455.4405" y="-1129" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_unknown()</text>
<text text-anchor="start" x="471.554" y="-1105" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<text text-anchor="start" x="476.0025" y="-1093" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A13&#45;&gt;A6 -->
<g id="edge14" class="edge">
<title>A13&#45;&gt;A6</title>
<path fill="none" stroke="#000000" d="M447.4566,-1070.9482C441.5256,-1061.0844 434.6094,-1051.909 426.5,-1044 374.9829,-993.756 325.0983,-1043.111 272.5,-994 243.8213,-967.2228 226.6316,-927.1021 217.4078,-892.1324"/>
<polygon fill="#000000" stroke="#000000" points="452.4203,-1079.7791 443.5976,-1073.2668 449.9703,-1075.4204 447.5204,-1071.0618 447.5204,-1071.0618 447.5204,-1071.0618 449.9703,-1075.4204 451.4431,-1068.8568 452.4203,-1079.7791 452.4203,-1079.7791"/>
<text text-anchor="middle" x="436.1705" y="-1065.1196" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote</text>
</g>
<!-- A13&#45;&gt;A6 -->
<g id="edge16" class="edge">
<title>A13&#45;&gt;A6</title>
<path fill="none" stroke="#000000" d="M465.3907,-1070.9482C459.5256,-1061.0844 452.6094,-1051.909 444.5,-1044 392.9829,-993.756 343.0983,-1043.111 290.5,-994 264.9581,-970.1515 248.5293,-935.7189 237.3987,-903.7675"/>
<polygon fill="#000000" stroke="#000000" points="470.278,-1079.7791 461.4985,-1073.2086 467.8569,-1075.4043 465.4357,-1071.0296 465.4357,-1071.0296 465.4357,-1071.0296 467.8569,-1075.4043 469.373,-1068.8506 470.278,-1079.7791 470.278,-1079.7791"/>
<polygon fill="#000000" stroke="#000000" points="237.3164,-903.5196 231.6278,-899.0879 233.5306,-892.1324 239.2192,-896.5641 237.3164,-903.5196"/>
<text text-anchor="middle" x="247.2697" y="-903.6664" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local</text>
</g>
<!-- A13&#45;&gt;A7 -->
<g id="edge23" class="edge">
<title>A13&#45;&gt;A7</title>
<path fill="none" stroke="#000000" d="M490.1836,-1079.7656C490.1205,-1055.771 490.0528,-1030.0526 489.9854,-1004.468"/>
<polygon fill="#000000" stroke="#000000" points="489.9587,-994.2909 494.4851,-1004.2789 489.9719,-999.2908 489.9851,-1004.2908 489.9851,-1004.2908 489.9851,-1004.2908 489.9719,-999.2908 485.4851,-1004.3027 489.9587,-994.2909 489.9587,-994.2909"/>
<text text-anchor="middle" x="481.6836" y="-1058.6618" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">use</text>
</g>
<!-- A16 -->
<g id="node17" class="node">
<title>A16</title>
<polygon fill="none" stroke="#000000" points="675.5,-836 675.5,-868 742.5,-868 742.5,-836 675.5,-836"/>
<text text-anchor="start" x="688.1585" y="-849" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InfosG3P</text>
<polygon fill="none" stroke="#000000" points="675.5,-816 675.5,-836 742.5,-836 742.5,-816 675.5,-816"/>
<polygon fill="none" stroke="#000000" points="675.5,-772 675.5,-816 742.5,-816 742.5,-772 675.5,-772"/>
<text text-anchor="start" x="685.384" y="-797" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_confs()</text>
<text text-anchor="start" x="693.168" y="-785" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">parse()</text>
</g>
<!-- A13&#45;&gt;A16 -->
<g id="edge24" class="edge">
<title>A13&#45;&gt;A16</title>
<path fill="none" stroke="#000000" d="M520.8307,-1079.7659C527.4996,-1066.7175 535.619,-1054.418 545.5,-1044 585.5429,-1001.781 628.6638,-1038.2075 666.5,-994 693.8359,-962.061 704.0094,-915.2881 707.5257,-878.278"/>
<polygon fill="#000000" stroke="#000000" points="708.3496,-868.1186 712.0265,-878.4497 707.9454,-873.1023 707.5412,-878.0859 707.5412,-878.0859 707.5412,-878.0859 707.9454,-873.1023 703.0559,-877.7221 708.3496,-868.1186 708.3496,-868.1186"/>
</g>
<!-- A14 -->
<g id="node15" class="node">
<title>A14</title>
<polygon fill="none" stroke="#000000" points="715.5,-1288 715.5,-1320 818.5,-1320 818.5,-1288 715.5,-1288"/>
<text text-anchor="start" x="756.162" y="-1301" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Infos</text>
<polygon fill="none" stroke="#000000" points="715.5,-1232 715.5,-1288 818.5,-1288 818.5,-1232 715.5,-1232"/>
<text text-anchor="start" x="758.9415" y="-1269" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">stat</text>
<text text-anchor="start" x="734.486" y="-1257" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">new_stat_data</text>
<text text-anchor="start" x="748.1035" y="-1245" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">info_dev</text>
<polygon fill="none" stroke="#000000" points="715.5,-1080 715.5,-1232 818.5,-1232 818.5,-1080 715.5,-1080"/>
<text text-anchor="start" x="742.8355" y="-1213" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">static_init()</text>
<text text-anchor="start" x="740.8845" y="-1201" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dev_value()</text>
<text text-anchor="start" x="737.8305" y="-1189" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">inc_counter()</text>
<text text-anchor="start" x="736.1605" y="-1177" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dec_counter()</text>
<text text-anchor="start" x="734.21" y="-1165" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_proxy_conf</text>
<text text-anchor="start" x="749.213" y="-1153" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_conf</text>
<text text-anchor="start" x="741.994" y="-1141" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_remove</text>
<text text-anchor="start" x="743.3745" y="-1129" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">update_db</text>
<text text-anchor="start" x="727.537" y="-1117" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">set_db_def_value</text>
<text text-anchor="start" x="736.9855" y="-1105" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">get_db_value</text>
<text text-anchor="start" x="725.3225" y="-1093" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ignore_this_device</text>
</g>
<!-- A14&#45;&gt;A15 -->
<g id="edge18" class="edge">
<title>A14&#45;&gt;A15</title>
<path fill="none" stroke="#000000" d="M775.7646,-1069.6098C780.6992,-1000.16 786.4738,-918.8867 790.0599,-868.4166"/>
<polygon fill="none" stroke="#000000" points="772.2606,-1069.5427 775.043,-1079.7656 779.243,-1070.0389 772.2606,-1069.5427"/>
</g>
<!-- A14&#45;&gt;A16 -->
<g id="edge19" class="edge">
<title>A14&#45;&gt;A16</title>
<path fill="none" stroke="#000000" d="M746.5983,-1069.6098C735.9981,-1000.16 723.5932,-918.8867 715.8899,-868.4166"/>
<polygon fill="none" stroke="#000000" points="743.1796,-1070.4082 748.1484,-1079.7656 750.0994,-1069.352 743.1796,-1070.4082"/>
</g>
<!-- A18&#45;&gt;A12 -->
<g id="edge26" class="edge">
<title>A18&#45;&gt;A12</title>
<path fill="none" stroke="#000000" d="M601.0124,-1467.8379C602.2644,-1435.8622 603.8382,-1395.6708 605.383,-1356.2186"/>
<polygon fill="none" stroke="#000000" points="597.5116,-1467.7902 600.6176,-1477.9196 604.5063,-1468.0642 597.5116,-1467.7902"/>
</g>
<!-- A18&#45;&gt;A13 -->
<g id="edge27" class="edge">
<title>A18&#45;&gt;A13</title>
<path fill="none" stroke="#000000" d="M577.8104,-1468.3987C564.1817,-1426.503 545.9076,-1370.327 529.6002,-1320.197"/>
<polygon fill="none" stroke="#000000" points="574.4857,-1469.4928 580.9076,-1477.9196 581.1424,-1467.3273 574.4857,-1469.4928"/>
</g>
<!-- A19 -->
<g id="node20" class="node">
<title>A19</title>
<polygon fill="none" stroke="#000000" points="465.5,-1626 465.5,-1658 540.5,-1658 540.5,-1626 465.5,-1626"/>
<text text-anchor="start" x="485.2175" y="-1639" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Modbus</text>
<polygon fill="none" stroke="#000000" points="465.5,-1474 465.5,-1626 540.5,-1626 540.5,-1474 465.5,-1474"/>
<text text-anchor="start" x="494.6615" y="-1607" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">que</text>
<text text-anchor="start" x="475.49" y="-1583" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">snd_handler</text>
<text text-anchor="start" x="476.605" y="-1571" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rsp_handler</text>
<text text-anchor="start" x="486.6085" y="-1559" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">timeout</text>
<text text-anchor="start" x="476.8895" y="-1547" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">max_retires</text>
<text text-anchor="start" x="484.942" y="-1535" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">last_xxx</text>
<text text-anchor="start" x="496.8915" y="-1523" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">err</text>
<text text-anchor="start" x="483.5535" y="-1511" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">retry_cnt</text>
<text text-anchor="start" x="481.879" y="-1499" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">req_pend</text>
<text text-anchor="start" x="496.3365" y="-1487" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tim</text>
<polygon fill="none" stroke="#000000" points="465.5,-1406 465.5,-1474 540.5,-1474 540.5,-1406 465.5,-1406"/>
<text text-anchor="start" x="476.89" y="-1455" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">build_msg()</text>
<text text-anchor="start" x="480.224" y="-1443" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">recv_req()</text>
<text text-anchor="start" x="477.724" y="-1431" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">recv_resp()</text>
<text text-anchor="start" x="488.0025" y="-1419" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A19&#45;&gt;A12 -->
<g id="edge29" class="edge">
<title>A19&#45;&gt;A12</title>
<path fill="none" stroke="#000000" d="M543.2517,-1407.8755C548.7979,-1390.9826 554.5472,-1373.4708 560.249,-1356.1039"/>
<polygon fill="#000000" stroke="#000000" points="540.0116,-1417.7444 538.8555,-1406.8397 541.5713,-1412.9939 543.131,-1408.2434 543.131,-1408.2434 543.131,-1408.2434 541.5713,-1412.9939 547.4065,-1409.6471 540.0116,-1417.7444 540.0116,-1417.7444"/>
<text text-anchor="middle" x="562.6255" y="-1372.9622" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
<text text-anchor="middle" x="537.6351" y="-1394.8861" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A19&#45;&gt;A13 -->
<g id="edge28" class="edge">
<title>A19&#45;&gt;A13</title>
<path fill="none" stroke="#000000" d="M497.5586,-1395.2885C496.6573,-1370.3511 495.723,-1344.5031 494.8407,-1320.0924"/>
<polygon fill="#000000" stroke="#000000" points="497.9291,-1405.5379 493.0707,-1395.7071 497.7484,-1400.5412 497.5678,-1395.5445 497.5678,-1395.5445 497.5678,-1395.5445 497.7484,-1400.5412 502.0648,-1395.3819 497.9291,-1405.5379 497.9291,-1405.5379"/>
<text text-anchor="middle" x="503.9423" y="-1334.9015" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
<text text-anchor="middle" x="488.8275" y="-1384.7289" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A20 -->
<g id="node21" class="node">
<title>A20</title>
<polygon fill="none" stroke="#000000" points=".5,-1228 .5,-1260 107.5,-1260 107.5,-1228 .5,-1228"/>
<text text-anchor="start" x="24.2695" y="-1241" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ModbusConn</text>
<polygon fill="none" stroke="#000000" points=".5,-1160 .5,-1228 107.5,-1228 107.5,-1160 .5,-1160"/>
<text text-anchor="start" x="44.5515" y="-1209" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">host</text>
<text text-anchor="start" x="45.387" y="-1197" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">port</text>
<text text-anchor="start" x="43.997" y="-1185" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="10.383" y="-1173" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">stream:InverterG3P</text>
<polygon fill="none" stroke="#000000" points=".5,-1140 .5,-1160 107.5,-1160 107.5,-1140 .5,-1140"/>
</g>
<!-- A20&#45;&gt;A6 -->
<g id="edge30" class="edge">
<title>A20&#45;&gt;A6</title>
<path fill="none" stroke="#000000" d="M76.9761,-1139.8453C88.4172,-1110.8106 102.486,-1075.5172 115.5,-1044 135.0539,-996.6445 157.5886,-943.9703 175.9091,-901.6045"/>
<polygon fill="#000000" stroke="#000000" points="179.9904,-892.1757 180.1477,-903.1405 178.0042,-896.7643 176.0179,-901.3529 176.0179,-901.3529 176.0179,-901.3529 178.0042,-896.7643 171.8882,-899.5652 179.9904,-892.1757 179.9904,-892.1757"/>
<text text-anchor="middle" x="180.5468" y="-909.168" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
<text text-anchor="middle" x="75.7674" y="-1116.8819" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
<!-- A9&#45;&gt;A6 -->
<g id="edge11" class="edge">
<title>A9&#45;&gt;A6</title>
<path fill="none" stroke="#000000" d="M398.4907,-377.9458C397.9843,-361.5736 397.4269,-343.5504 396.8896,-326.177"/>
<polygon fill="#000000" stroke="#000000" points="396.576,-316.0403 401.3831,-325.8963 396.7307,-321.0379 396.8853,-326.0355 396.8853,-326.0355 396.8853,-326.0355 396.7307,-321.0379 392.3874,-326.1746 396.576,-316.0403 396.576,-316.0403"/>
<text text-anchor="middle" x="405.5847" y="-330.8965" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
<text text-anchor="middle" x="389.482" y="-357.0896" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -15,46 +15,17 @@
[IterRegistry]^[Inverter|server_side:bool;header_valid:bool;header_len:unsigned;data_len:unsigned;unique_id;node_id;sug_area;_recv_buffer:bytearray;_send_buffer:bytearray;_forward_buffer:bytearray;db:Infos;new_data:list;state|_read():void<abstract>;close():void;inc_counter():void;dec_counter():void]
[<<AsyncIfc>>||set_node_id();get_conn_no();;tx_add();tx_flush();tx_get();tx_peek();tx_log();tx_clear();tx_len();;fwd_add();fwd_flush();fwd_log();fwd_clear();rx_get();rx_peek();rx_log();rx_clear();rx_len();rx_set_cb();;prot_set_timeout_cb()]
[AsyncIfcImpl|fwd_fifo:ByteFifo;tx_fifo:ByteFifo;rx_fifo:ByteFifo;conn_no:Count;node_id;timeout_cb]
[AsyncStream|reader;writer;addr;r_addr;l_addr|;<async>loop;disc();close();healthy();;__async_read();__async_write();__async_forward()]
[AsyncStreamServer|async_create_remote|<async>server_loop();<async>_async_forward();<async>publish_outstanding_mqtt();close()]
[AsyncStreamClient||<async>client_loop();<async>_async_forward())]
[<<AsyncIfc>>]^-.-[AsyncIfcImpl]
[AsyncIfcImpl]^[AsyncStream]
[AsyncStream]^[AsyncStreamServer]
[AsyncStream]^[AsyncStreamClient]
[<<AsyncIfc>>]
[Talent|ifc:AsyncIfc;conn_no;addr;;await_conn_resp_cnt;id_str;contact_name;contact_mail;db:InfosG3;mb:Modbus;switch|msg_contact_info();msg_ota_update();msg_get_time();msg_collector_data();msg_inverter_data();msg_unknown();;healthy();close()]
[Talent]<remote-[InverterG3]
[InverterG3]-remote>[AsyncStreamClient]
[Talent]<-local++[InverterG3]
[InverterG3]++local->[AsyncStreamServer]
[InverterG3]-1..2>[<<MessageProt>>]
[InverterG3]-1..2>[<<AsyncIfc>>]
[SolarmanV5|ifc:AsyncIfc;conn_no;addr;;control;serial;snr;db:InfosG3P;mb:Modbus;switch|msg_unknown();;healthy();close()]
[SolarmanV5]<remote-[InverterG3P]
[InverterG3P]-remote>[AsyncStreamClient]
[SolarmanV5]<-local++[InverterG3P]
[InverterG3P]++local->[AsyncStreamServer]
[InverterG3P]-1..2>[<<MessageProt>>]
[InverterG3P]-1..2>[<<AsyncIfc>>]
[Infos|stat;new_stat_data;info_dev|static_init();dev_value();inc_counter();dec_counter();ha_proxy_conf;ha_conf;ha_remove;update_db;set_db_def_value;get_db_value;ignore_this_device]
[Infos]^[InfosG3||ha_confs();parse()]
[Infos]^[InfosG3P||ha_confs();parse()]
[<<MessageProt>>]use-.->[<<AsyncIfc>>]
[Talent]^[ConnectionG3]
[Talent]use->[<<AsyncIfc>>]
[Talent]->[InfosG3]
[SolarmanV5]use->[<<AsyncIfc>>]
[SolarmanV5]->[InfosG3P]
[IterRegistry]^[Message|node_id|inc_counter();dec_counter()]
[Message]^[Talent]
[Message]^[SolarmanV5]
[Modbus|que;;snd_handler;rsp_handler;timeout;max_retires;last_xxx;err;retry_cnt;req_pend;tim|build_msg();recv_req();recv_resp();close()]
[Modbus]<1-has[SolarmanV5]
[Modbus]<1-has[Talent]
[ModbusConn|host;port;addr;stream:InverterG3P;|]has-1>[InverterG3P]

418
app/proxy_2.svg Normal file
View File

@@ -0,0 +1,418 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: G Pages: 1 -->
<svg width="438pt" height="1820pt"
viewBox="0.00 0.00 438.35 1820.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1816)">
<title>G</title>
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-1816 434.348,-1816 434.348,4 -4,4"/>
<!-- A0 -->
<g id="node1" class="node">
<title>A0</title>
<polygon fill="#fff8dc" stroke="#000000" points="108.5444,-1788 .1516,-1788 .1516,-1752 114.5444,-1752 114.5444,-1782 108.5444,-1788"/>
<polyline fill="none" stroke="#000000" points="108.5444,-1788 108.5444,-1782 "/>
<polyline fill="none" stroke="#000000" points="114.5444,-1782 108.5444,-1782 "/>
<text text-anchor="middle" x="57.348" y="-1773" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">You can stick notes</text>
<text text-anchor="middle" x="57.348" y="-1761" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">on diagrams too!</text>
</g>
<!-- A1 -->
<g id="node2" class="node">
<title>A1</title>
<polygon fill="none" stroke="#000000" points="133.348,-1780 133.348,-1812 204.348,-1812 204.348,-1780 133.348,-1780"/>
<text text-anchor="start" x="143.293" y="-1793" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">IterRegistry</text>
<polygon fill="none" stroke="#000000" points="133.348,-1760 133.348,-1780 204.348,-1780 204.348,-1760 133.348,-1760"/>
<polygon fill="none" stroke="#000000" points="133.348,-1728 133.348,-1760 204.348,-1760 204.348,-1728 133.348,-1728"/>
<text text-anchor="start" x="150.787" y="-1741" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__iter__</text>
</g>
<!-- A14 -->
<g id="node15" class="node">
<title>A14</title>
<polygon fill="none" stroke="#000000" points="128.348,-1574 128.348,-1606 209.348,-1606 209.348,-1574 128.348,-1574"/>
<text text-anchor="start" x="148.5655" y="-1587" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Message</text>
<polygon fill="none" stroke="#000000" points="128.348,-1542 128.348,-1574 209.348,-1574 209.348,-1542 128.348,-1542"/>
<text text-anchor="start" x="151.0615" y="-1555" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">node_id</text>
<polygon fill="none" stroke="#000000" points="128.348,-1498 128.348,-1542 209.348,-1542 209.348,-1498 128.348,-1498"/>
<text text-anchor="start" x="139.6785" y="-1523" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">inc_counter()</text>
<text text-anchor="start" x="138.0085" y="-1511" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dec_counter()</text>
</g>
<!-- A1&#45;&gt;A14 -->
<g id="edge19" class="edge">
<title>A1&#45;&gt;A14</title>
<path fill="none" stroke="#000000" d="M168.348,-1717.8572C168.348,-1684.1684 168.348,-1640.4162 168.348,-1606.3079"/>
<polygon fill="none" stroke="#000000" points="164.8481,-1717.9674 168.348,-1727.9674 171.8481,-1717.9674 164.8481,-1717.9674"/>
</g>
<!-- A2 -->
<g id="node3" class="node">
<title>A2</title>
<polygon fill="none" stroke="#000000" points="308.348,-584 308.348,-616 430.348,-616 430.348,-584 308.348,-584"/>
<text text-anchor="start" x="345.7325" y="-597" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InverterG3</text>
<polygon fill="none" stroke="#000000" points="308.348,-528 308.348,-584 430.348,-584 430.348,-528 308.348,-528"/>
<text text-anchor="start" x="359.345" y="-565" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="329.901" y="-553" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote:StreamPtr</text>
<text text-anchor="start" x="335.18" y="-541" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local:StreamPtr</text>
<polygon fill="none" stroke="#000000" points="308.348,-472 308.348,-528 430.348,-528 430.348,-472 308.348,-472"/>
<text text-anchor="start" x="317.9515" y="-509" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote()</text>
<text text-anchor="start" x="354.3505" y="-485" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A7 -->
<g id="node8" class="node">
<title>A7</title>
<polygon fill="none" stroke="#000000" points="12.348,-100 12.348,-132 190.348,-132 190.348,-100 12.348,-100"/>
<text text-anchor="start" x="56.8995" y="-113" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStreamServer</text>
<polygon fill="none" stroke="#000000" points="12.348,-68 12.348,-100 190.348,-100 190.348,-68 12.348,-68"/>
<text text-anchor="start" x="53.2805" y="-81" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote</text>
<polygon fill="none" stroke="#000000" points="12.348,0 12.348,-68 190.348,-68 190.348,0 12.348,0"/>
<text text-anchor="start" x="53.0055" y="-49" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;server_loop()</text>
<text text-anchor="start" x="43.8365" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;_async_forward()</text>
<text text-anchor="start" x="22.157" y="-25" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;publish_outstanding_mqtt()</text>
<text text-anchor="start" x="86.3505" y="-13" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A2&#45;&gt;A7 -->
<g id="edge8" class="edge">
<title>A2&#45;&gt;A7</title>
<path fill="none" stroke="#000000" d="M337.3924,-460.3836C333.0399,-447.6226 328.8668,-434.5306 325.348,-422 295.9146,-317.1872 337.6516,-271.9662 276.348,-182 253.3709,-148.28 233.3826,-154.5085 199.348,-132 199.2571,-131.9399 199.1662,-131.8797 199.0752,-131.8196"/>
<polygon fill="#000000" stroke="#000000" points="337.4849,-460.65 343.2337,-465.0033 341.4263,-471.9842 335.6775,-467.6309 337.4849,-460.65"/>
<polygon fill="#000000" stroke="#000000" points="190.5035,-126.1357 201.3247,-127.9118 194.6706,-128.899 198.8378,-131.6622 198.8378,-131.6622 198.8378,-131.6622 194.6706,-128.899 196.3509,-135.4126 190.5035,-126.1357 190.5035,-126.1357"/>
<text text-anchor="middle" x="327.4894" y="-454.6398" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local</text>
</g>
<!-- A8 -->
<g id="node9" class="node">
<title>A8</title>
<polygon fill="none" stroke="#000000" points="208.348,-82 208.348,-114 346.348,-114 346.348,-82 208.348,-82"/>
<text text-anchor="start" x="234.845" y="-95" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStreamClient</text>
<polygon fill="none" stroke="#000000" points="208.348,-62 208.348,-82 346.348,-82 346.348,-62 208.348,-62"/>
<polygon fill="none" stroke="#000000" points="208.348,-18 208.348,-62 346.348,-62 346.348,-18 208.348,-18"/>
<text text-anchor="start" x="231.226" y="-43" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;client_loop()</text>
<text text-anchor="start" x="218.172" y="-31" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;_async_forward())</text>
</g>
<!-- A2&#45;&gt;A8 -->
<g id="edge6" class="edge">
<title>A2&#45;&gt;A8</title>
<path fill="none" stroke="#000000" d="M366.3359,-471.8318C361.9206,-397.9861 351.1813,-280.4371 325.348,-182 320.2128,-162.4325 312.4912,-141.8047 304.7338,-123.458"/>
<polygon fill="#000000" stroke="#000000" points="300.6874,-114.0894 308.7837,-121.4854 302.67,-118.6796 304.6526,-123.2698 304.6526,-123.2698 304.6526,-123.2698 302.67,-118.6796 300.5214,-125.0541 300.6874,-114.0894 300.6874,-114.0894"/>
<text text-anchor="middle" x="315.6341" y="-124.3784" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote</text>
</g>
<!-- A3 -->
<g id="node4" class="node">
<title>A3</title>
<polygon fill="none" stroke="#000000" points=".348,-342 .348,-374 122.348,-374 122.348,-342 .348,-342"/>
<text text-anchor="start" x="34.398" y="-355" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InverterG3P</text>
<polygon fill="none" stroke="#000000" points=".348,-286 .348,-342 122.348,-342 122.348,-286 .348,-286"/>
<text text-anchor="start" x="51.345" y="-323" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="21.901" y="-311" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote:StreamPtr</text>
<text text-anchor="start" x="27.18" y="-299" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local:StreamPtr</text>
<polygon fill="none" stroke="#000000" points=".348,-230 .348,-286 122.348,-286 122.348,-230 .348,-230"/>
<text text-anchor="start" x="9.9515" y="-267" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote()</text>
<text text-anchor="start" x="46.3505" y="-243" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A3&#45;&gt;A7 -->
<g id="edge12" class="edge">
<title>A3&#45;&gt;A7</title>
<path fill="none" stroke="#000000" d="M75.5849,-218.0021C79.7918,-193.1818 84.3705,-166.167 88.4854,-141.8895"/>
<polygon fill="#000000" stroke="#000000" points="75.572,-218.0786 78.5131,-224.6627 73.5667,-229.9099 70.6256,-223.3258 75.572,-218.0786"/>
<polygon fill="#000000" stroke="#000000" points="90.1576,-132.0235 92.9231,-142.6349 89.322,-136.9532 88.4864,-141.8829 88.4864,-141.8829 88.4864,-141.8829 89.322,-136.9532 84.0497,-141.1309 90.1576,-132.0235 90.1576,-132.0235"/>
<text text-anchor="middle" x="68.2622" y="-207.6261" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local</text>
</g>
<!-- A3&#45;&gt;A8 -->
<g id="edge10" class="edge">
<title>A3&#45;&gt;A8</title>
<path fill="none" stroke="#000000" d="M115.795,-229.9222C128.6843,-213.8036 142.6706,-197.0375 156.348,-182 175.0997,-161.3835 196.7546,-139.9587 216.5165,-121.2154"/>
<polygon fill="#000000" stroke="#000000" points="223.9878,-114.1704 219.7994,-124.3049 220.35,-117.6006 216.7122,-121.0309 216.7122,-121.0309 216.7122,-121.0309 220.35,-117.6006 213.625,-117.7568 223.9878,-114.1704 223.9878,-114.1704"/>
<text text-anchor="middle" x="216.5987" y="-129.7553" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote</text>
</g>
<!-- A4 -->
<g id="node5" class="node">
<title>A4</title>
<polygon fill="none" stroke="#000000" points="158.348,-982 158.348,-1014 275.348,-1014 275.348,-982 158.348,-982"/>
<text text-anchor="start" x="186.277" y="-995" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;&lt;AsyncIfc&gt;&gt;</text>
<polygon fill="none" stroke="#000000" points="158.348,-962 158.348,-982 275.348,-982 275.348,-962 158.348,-962"/>
<polygon fill="none" stroke="#000000" points="158.348,-666 158.348,-962 275.348,-962 275.348,-666 158.348,-666"/>
<text text-anchor="start" x="186.284" y="-943" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">set_node_id()</text>
<text text-anchor="start" x="184.614" y="-931" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">get_conn_no()</text>
<text text-anchor="start" x="198.5115" y="-907" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_add()</text>
<text text-anchor="start" x="196.292" y="-895" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_flush()</text>
<text text-anchor="start" x="199.9015" y="-883" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_get()</text>
<text text-anchor="start" x="196.0115" y="-871" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_peek()</text>
<text text-anchor="start" x="200.1815" y="-859" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_log()</text>
<text text-anchor="start" x="196.017" y="-847" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_clear()</text>
<text text-anchor="start" x="200.1815" y="-835" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_len()</text>
<text text-anchor="start" x="194.6225" y="-811" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_add()</text>
<text text-anchor="start" x="192.403" y="-799" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_flush()</text>
<text text-anchor="start" x="196.2925" y="-787" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_log()</text>
<text text-anchor="start" x="192.128" y="-775" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_clear()</text>
<text text-anchor="start" x="199.6265" y="-763" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_get()</text>
<text text-anchor="start" x="195.7365" y="-751" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_peek()</text>
<text text-anchor="start" x="199.9065" y="-739" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_log()</text>
<text text-anchor="start" x="195.742" y="-727" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_clear()</text>
<text text-anchor="start" x="199.9065" y="-715" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_len()</text>
<text text-anchor="start" x="191.847" y="-703" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_set_cb()</text>
<text text-anchor="start" x="168.2275" y="-679" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">prot_set_timeout_cb()</text>
</g>
<!-- A5 -->
<g id="node6" class="node">
<title>A5</title>
<polygon fill="none" stroke="#000000" points="170.348,-574 170.348,-606 263.348,-606 263.348,-574 170.348,-574"/>
<text text-anchor="start" x="188.512" y="-587" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncIfcImpl</text>
<polygon fill="none" stroke="#000000" points="170.348,-482 170.348,-574 263.348,-574 263.348,-482 170.348,-482"/>
<text text-anchor="start" x="179.896" y="-555" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_fifo:ByteFifo</text>
<text text-anchor="start" x="183.785" y="-543" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_fifo:ByteFifo</text>
<text text-anchor="start" x="183.51" y="-531" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_fifo:ByteFifo</text>
<text text-anchor="start" x="182.944" y="-519" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">conn_no:Count</text>
<text text-anchor="start" x="199.0615" y="-507" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">node_id</text>
<text text-anchor="start" x="192.3975" y="-495" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">timeout_cb</text>
</g>
<!-- A4&#45;&gt;A5 -->
<g id="edge1" class="edge">
<title>A4&#45;&gt;A5</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M216.348,-655.3047C216.348,-637.8196 216.348,-621.0638 216.348,-606.0999"/>
<polygon fill="none" stroke="#000000" points="212.8481,-655.6759 216.348,-665.6759 219.8481,-655.676 212.8481,-655.6759"/>
</g>
<!-- A6 -->
<g id="node7" class="node">
<title>A6</title>
<polygon fill="none" stroke="#000000" points="165.348,-390 165.348,-422 267.348,-422 267.348,-390 165.348,-390"/>
<text text-anchor="start" x="186.622" y="-403" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStream</text>
<polygon fill="none" stroke="#000000" points="165.348,-310 165.348,-390 267.348,-390 267.348,-310 165.348,-310"/>
<text text-anchor="start" x="201.901" y="-371" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">reader</text>
<text text-anchor="start" x="204.131" y="-359" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">writer</text>
<text text-anchor="start" x="206.345" y="-347" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="201.901" y="-335" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">r_addr</text>
<text text-anchor="start" x="202.456" y="-323" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">l_addr</text>
<polygon fill="none" stroke="#000000" points="165.348,-182 165.348,-310 267.348,-310 267.348,-182 165.348,-182"/>
<text text-anchor="start" x="188.002" y="-279" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;loop</text>
<text text-anchor="start" x="204.13" y="-267" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">disc()</text>
<text text-anchor="start" x="201.3505" y="-255" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<text text-anchor="start" x="196.902" y="-243" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<text text-anchor="start" x="181.6185" y="-219" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__async_read()</text>
<text text-anchor="start" x="181.069" y="-207" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__async_write()</text>
<text text-anchor="start" x="174.955" y="-195" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__async_forward()</text>
</g>
<!-- A5&#45;&gt;A6 -->
<g id="edge2" class="edge">
<title>A5&#45;&gt;A6</title>
<path fill="none" stroke="#000000" d="M216.348,-471.886C216.348,-456.1951 216.348,-439.1858 216.348,-422.1976"/>
<polygon fill="none" stroke="#000000" points="212.8481,-471.9932 216.348,-481.9932 219.8481,-471.9933 212.8481,-471.9932"/>
</g>
<!-- A6&#45;&gt;A7 -->
<g id="edge3" class="edge">
<title>A6&#45;&gt;A7</title>
<path fill="none" stroke="#000000" d="M160.8205,-188.0478C151.5043,-168.9294 142.1189,-149.6691 133.6443,-132.2776"/>
<polygon fill="none" stroke="#000000" points="157.7107,-189.6563 165.2376,-197.1126 164.0034,-186.5899 157.7107,-189.6563"/>
</g>
<!-- A6&#45;&gt;A8 -->
<g id="edge4" class="edge">
<title>A6&#45;&gt;A8</title>
<path fill="none" stroke="#000000" d="M249.927,-172.088C255.2644,-151.438 260.4749,-131.2796 264.8954,-114.1772"/>
<polygon fill="none" stroke="#000000" points="246.498,-171.3682 247.3841,-181.9259 253.2753,-173.12 246.498,-171.3682"/>
</g>
<!-- A9 -->
<g id="node10" class="node">
<title>A9</title>
<polygon fill="none" stroke="#000000" points="280.348,-1344 280.348,-1376 394.348,-1376 394.348,-1344 280.348,-1344"/>
<text text-anchor="start" x="323.456" y="-1357" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Talent</text>
<polygon fill="none" stroke="#000000" points="280.348,-1192 280.348,-1344 394.348,-1344 394.348,-1192 280.348,-1192"/>
<text text-anchor="start" x="312.0665" y="-1325" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ifc:AsyncIfc</text>
<text text-anchor="start" x="318.171" y="-1313" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">conn_no</text>
<text text-anchor="start" x="327.345" y="-1301" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="290.111" y="-1277" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">await_conn_resp_cnt</text>
<text text-anchor="start" x="325.1255" y="-1265" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">id_str</text>
<text text-anchor="start" x="305.948" y="-1253" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">contact_name</text>
<text text-anchor="start" x="309.288" y="-1241" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">contact_mail</text>
<text text-anchor="start" x="312.8925" y="-1229" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:InfosG3</text>
<text text-anchor="start" x="311.232" y="-1217" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">mb:Modbus</text>
<text text-anchor="start" x="323.46" y="-1205" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">switch</text>
<polygon fill="none" stroke="#000000" points="280.348,-1064 280.348,-1192 394.348,-1192 394.348,-1064 280.348,-1064"/>
<text text-anchor="start" x="294.8405" y="-1173" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_contact_info()</text>
<text text-anchor="start" x="296.7805" y="-1161" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_ota_update()</text>
<text text-anchor="start" x="302.6245" y="-1149" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_get_time()</text>
<text text-anchor="start" x="290.6765" y="-1137" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_collector_data()</text>
<text text-anchor="start" x="292.6215" y="-1125" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_inverter_data()</text>
<text text-anchor="start" x="301.7885" y="-1113" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_unknown()</text>
<text text-anchor="start" x="317.902" y="-1089" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<text text-anchor="start" x="322.3505" y="-1077" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A9&#45;&gt;A2 -->
<g id="edge5" class="edge">
<title>A9&#45;&gt;A2</title>
<path fill="none" stroke="#000000" d="M356.4487,-1053.6998C358.0019,-1040.2968 359.3489,-1026.94 360.348,-1014 371.1987,-873.4591 367.4052,-708.5736 366.556,-616.1962"/>
<polygon fill="#000000" stroke="#000000" points="355.2231,-1063.9519 351.942,-1053.4885 355.8166,-1058.9873 356.4102,-1054.0226 356.4102,-1054.0226 356.4102,-1054.0226 355.8166,-1058.9873 360.8784,-1054.5568 355.2231,-1063.9519 355.2231,-1063.9519"/>
<text text-anchor="middle" x="348.982" y="-1041.9506" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote</text>
</g>
<!-- A9&#45;&gt;A2 -->
<g id="edge7" class="edge">
<title>A9&#45;&gt;A2</title>
<path fill="none" stroke="#000000" d="M374.3992,-1053.6998C376.0019,-1040.2968 377.3489,-1026.94 378.348,-1014 388.7431,-879.3607 385.698,-722.3785 379.8141,-628.21"/>
<polygon fill="#000000" stroke="#000000" points="373.1253,-1063.9519 369.8928,-1053.4733 373.7419,-1058.9901 374.3585,-1054.0283 374.3585,-1054.0283 374.3585,-1054.0283 373.7419,-1058.9901 378.8241,-1054.5832 373.1253,-1063.9519 373.1253,-1063.9519"/>
<polygon fill="#000000" stroke="#000000" points="379.8116,-628.1704 375.4269,-622.4455 379.0249,-616.1962 383.4097,-621.9211 379.8116,-628.1704"/>
<text text-anchor="middle" x="388.6473" y="-630.7293" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local</text>
</g>
<!-- A9&#45;&gt;A4 -->
<g id="edge15" class="edge">
<title>A9&#45;&gt;A4</title>
<path fill="none" stroke="#000000" d="M287.6089,-1063.7944C283.4127,-1050.6165 279.1452,-1037.2145 274.8907,-1023.853"/>
<polygon fill="#000000" stroke="#000000" points="271.7962,-1014.1348 279.1182,-1022.298 273.3133,-1018.8991 274.8304,-1023.6634 274.8304,-1023.6634 274.8304,-1023.6634 273.3133,-1018.8991 270.5425,-1025.0288 271.7962,-1014.1348 271.7962,-1014.1348"/>
<text text-anchor="middle" x="274.0553" y="-1046.0873" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">use</text>
</g>
<!-- A12 -->
<g id="node13" class="node">
<title>A12</title>
<polygon fill="none" stroke="#000000" points="293.348,-856 293.348,-888 360.348,-888 360.348,-856 293.348,-856"/>
<text text-anchor="start" x="309.341" y="-869" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InfosG3</text>
<polygon fill="none" stroke="#000000" points="293.348,-836 293.348,-856 360.348,-856 360.348,-836 293.348,-836"/>
<polygon fill="none" stroke="#000000" points="293.348,-792 293.348,-836 360.348,-836 360.348,-792 293.348,-792"/>
<text text-anchor="start" x="303.232" y="-817" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_confs()</text>
<text text-anchor="start" x="311.016" y="-805" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">parse()</text>
</g>
<!-- A9&#45;&gt;A12 -->
<g id="edge16" class="edge">
<title>A9&#45;&gt;A12</title>
<path fill="none" stroke="#000000" d="M332.8263,-1063.7944C331.1366,-1005.4246 329.3197,-942.658 328.0413,-898.4955"/>
<polygon fill="#000000" stroke="#000000" points="327.7446,-888.2447 332.5321,-898.1103 327.8893,-893.2426 328.034,-898.2406 328.034,-898.2406 328.034,-898.2406 327.8893,-893.2426 323.5359,-898.3708 327.7446,-888.2447 327.7446,-888.2447"/>
</g>
<!-- A10 -->
<g id="node11" class="node">
<title>A10</title>
<polygon fill="none" stroke="#000000" points="50.348,-1308 50.348,-1340 141.348,-1340 141.348,-1308 50.348,-1308"/>
<text text-anchor="start" x="68.343" y="-1321" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">SolarmanV5</text>
<polygon fill="none" stroke="#000000" points="50.348,-1168 50.348,-1308 141.348,-1308 141.348,-1168 50.348,-1168"/>
<text text-anchor="start" x="70.5665" y="-1289" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ifc:AsyncIfc</text>
<text text-anchor="start" x="76.671" y="-1277" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">conn_no</text>
<text text-anchor="start" x="85.845" y="-1265" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="80.846" y="-1241" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">control</text>
<text text-anchor="start" x="83.9055" y="-1229" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">serial</text>
<text text-anchor="start" x="88.904" y="-1217" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">snr</text>
<text text-anchor="start" x="68.058" y="-1205" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:InfosG3P</text>
<text text-anchor="start" x="69.732" y="-1193" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">mb:Modbus</text>
<text text-anchor="start" x="81.96" y="-1181" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">switch</text>
<polygon fill="none" stroke="#000000" points="50.348,-1100 50.348,-1168 141.348,-1168 141.348,-1100 50.348,-1100"/>
<text text-anchor="start" x="60.2885" y="-1149" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_unknown()</text>
<text text-anchor="start" x="76.402" y="-1125" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<text text-anchor="start" x="80.8505" y="-1113" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A10&#45;&gt;A3 -->
<g id="edge9" class="edge">
<title>A10&#45;&gt;A3</title>
<path fill="none" stroke="#000000" d="M63.2812,-1090.0398C59.4779,-1064.8912 56.2888,-1038.6862 54.348,-1014 36.0005,-780.6307 43.7035,-502.9057 52.599,-374.1544"/>
<polygon fill="#000000" stroke="#000000" points="64.8268,-1099.9929 58.8455,-1090.8019 64.0595,-1095.0521 63.2922,-1090.1113 63.2922,-1090.1113 63.2922,-1090.1113 64.0595,-1095.0521 67.7389,-1089.4208 64.8268,-1099.9929 64.8268,-1099.9929"/>
<text text-anchor="middle" x="53.6931" y="-1080.3784" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote</text>
</g>
<!-- A10&#45;&gt;A3 -->
<g id="edge11" class="edge">
<title>A10&#45;&gt;A3</title>
<path fill="none" stroke="#000000" d="M80.9376,-1090.0398C77.4779,-1064.8912 74.2888,-1038.6862 72.348,-1014 54.556,-787.6956 61.261,-519.6805 63.1505,-386.2518"/>
<polygon fill="#000000" stroke="#000000" points="82.3274,-1099.9929 76.4876,-1090.7113 81.6359,-1095.0409 80.9444,-1090.089 80.9444,-1090.089 80.9444,-1090.089 81.6359,-1095.0409 85.4011,-1089.4666 82.3274,-1099.9929 82.3274,-1099.9929"/>
<polygon fill="#000000" stroke="#000000" points="63.1517,-386.1533 59.2325,-380.1002 63.3125,-374.1544 67.2317,-380.2074 63.1517,-386.1533"/>
<text text-anchor="middle" x="71.5214" y="-389.3921" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local</text>
</g>
<!-- A10&#45;&gt;A4 -->
<g id="edge17" class="edge">
<title>A10&#45;&gt;A4</title>
<path fill="none" stroke="#000000" d="M133.6332,-1099.7656C141.3073,-1075.6649 149.5353,-1049.8249 157.7176,-1024.1284"/>
<polygon fill="#000000" stroke="#000000" points="160.8501,-1014.2909 162.1038,-1025.1848 159.333,-1019.0552 157.8159,-1023.8195 157.8159,-1023.8195 157.8159,-1023.8195 159.333,-1019.0552 153.5281,-1022.4541 160.8501,-1014.2909 160.8501,-1014.2909"/>
<text text-anchor="middle" x="131.0789" y="-1076.9294" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">use</text>
</g>
<!-- A13 -->
<g id="node14" class="node">
<title>A13</title>
<polygon fill="none" stroke="#000000" points="73.348,-856 73.348,-888 140.348,-888 140.348,-856 73.348,-856"/>
<text text-anchor="start" x="86.0065" y="-869" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InfosG3P</text>
<polygon fill="none" stroke="#000000" points="73.348,-836 73.348,-856 140.348,-856 140.348,-836 73.348,-836"/>
<polygon fill="none" stroke="#000000" points="73.348,-792 73.348,-836 140.348,-836 140.348,-792 73.348,-792"/>
<text text-anchor="start" x="83.232" y="-817" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_confs()</text>
<text text-anchor="start" x="91.016" y="-805" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">parse()</text>
</g>
<!-- A10&#45;&gt;A13 -->
<g id="edge18" class="edge">
<title>A10&#45;&gt;A13</title>
<path fill="none" stroke="#000000" d="M98.8285,-1099.7656C100.7699,-1032.6997 103.1011,-952.1665 104.6479,-898.7305"/>
<polygon fill="#000000" stroke="#000000" points="104.9465,-888.4166 109.1551,-898.5427 104.8017,-893.4145 104.657,-898.4124 104.657,-898.4124 104.657,-898.4124 104.8017,-893.4145 100.1589,-898.2822 104.9465,-888.4166 104.9465,-888.4166"/>
</g>
<!-- A11 -->
<g id="node12" class="node">
<title>A11</title>
<polygon fill="none" stroke="#000000" points="159.348,-1308 159.348,-1340 262.348,-1340 262.348,-1308 159.348,-1308"/>
<text text-anchor="start" x="200.01" y="-1321" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Infos</text>
<polygon fill="none" stroke="#000000" points="159.348,-1252 159.348,-1308 262.348,-1308 262.348,-1252 159.348,-1252"/>
<text text-anchor="start" x="202.7895" y="-1289" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">stat</text>
<text text-anchor="start" x="178.334" y="-1277" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">new_stat_data</text>
<text text-anchor="start" x="191.9515" y="-1265" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">info_dev</text>
<polygon fill="none" stroke="#000000" points="159.348,-1100 159.348,-1252 262.348,-1252 262.348,-1100 159.348,-1100"/>
<text text-anchor="start" x="186.6835" y="-1233" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">static_init()</text>
<text text-anchor="start" x="184.7325" y="-1221" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dev_value()</text>
<text text-anchor="start" x="181.6785" y="-1209" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">inc_counter()</text>
<text text-anchor="start" x="180.0085" y="-1197" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dec_counter()</text>
<text text-anchor="start" x="178.058" y="-1185" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_proxy_conf</text>
<text text-anchor="start" x="193.061" y="-1173" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_conf</text>
<text text-anchor="start" x="185.842" y="-1161" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_remove</text>
<text text-anchor="start" x="187.2225" y="-1149" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">update_db</text>
<text text-anchor="start" x="171.385" y="-1137" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">set_db_def_value</text>
<text text-anchor="start" x="180.8335" y="-1125" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">get_db_value</text>
<text text-anchor="start" x="169.1705" y="-1113" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ignore_this_device</text>
</g>
<!-- A11&#45;&gt;A12 -->
<g id="edge13" class="edge">
<title>A11&#45;&gt;A12</title>
<path fill="none" stroke="#000000" d="M259.3612,-1090.2414C268.1716,-1065.1077 276.9072,-1038.8566 284.348,-1014 296.9582,-971.8745 308.4598,-923.1578 316.2258,-888.0062"/>
<polygon fill="none" stroke="#000000" points="256.0104,-1089.2193 255.9834,-1099.8141 262.6115,-1091.5486 256.0104,-1089.2193"/>
</g>
<!-- A11&#45;&gt;A13 -->
<g id="edge14" class="edge">
<title>A11&#45;&gt;A13</title>
<path fill="none" stroke="#000000" d="M170.1294,-1090.3375C162.6366,-1065.0902 155.0603,-1038.773 148.348,-1014 136.8889,-971.7079 125.3116,-923.2186 117.2225,-888.1884"/>
<polygon fill="none" stroke="#000000" points="166.7853,-1091.3716 172.995,-1099.9559 173.4939,-1089.3728 166.7853,-1091.3716"/>
</g>
<!-- A14&#45;&gt;A9 -->
<g id="edge20" class="edge">
<title>A14&#45;&gt;A9</title>
<path fill="none" stroke="#000000" d="M207.7336,-1489.2507C227.8317,-1456.1375 252.0435,-1414.492 271.348,-1376 274.3143,-1370.0855 277.269,-1364.0055 280.1912,-1357.8349"/>
<polygon fill="none" stroke="#000000" points="204.6683,-1487.555 202.4506,-1497.9151 210.6449,-1491.1992 204.6683,-1487.555"/>
</g>
<!-- A14&#45;&gt;A10 -->
<g id="edge21" class="edge">
<title>A14&#45;&gt;A10</title>
<path fill="none" stroke="#000000" d="M154.3052,-1488.1339C145.0994,-1446.2665 132.7762,-1390.2214 121.7769,-1340.197"/>
<polygon fill="none" stroke="#000000" points="150.8909,-1488.9045 156.4568,-1497.9196 157.7276,-1487.4012 150.8909,-1488.9045"/>
</g>
<!-- A15 -->
<g id="node16" class="node">
<title>A15</title>
<polygon fill="none" stroke="#000000" points="263.348,-1646 263.348,-1678 338.348,-1678 338.348,-1646 263.348,-1646"/>
<text text-anchor="start" x="283.0655" y="-1659" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Modbus</text>
<polygon fill="none" stroke="#000000" points="263.348,-1494 263.348,-1646 338.348,-1646 338.348,-1494 263.348,-1494"/>
<text text-anchor="start" x="292.5095" y="-1627" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">que</text>
<text text-anchor="start" x="273.338" y="-1603" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">snd_handler</text>
<text text-anchor="start" x="274.453" y="-1591" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rsp_handler</text>
<text text-anchor="start" x="284.4565" y="-1579" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">timeout</text>
<text text-anchor="start" x="274.7375" y="-1567" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">max_retires</text>
<text text-anchor="start" x="282.79" y="-1555" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">last_xxx</text>
<text text-anchor="start" x="294.7395" y="-1543" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">err</text>
<text text-anchor="start" x="281.4015" y="-1531" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">retry_cnt</text>
<text text-anchor="start" x="279.727" y="-1519" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">req_pend</text>
<text text-anchor="start" x="294.1845" y="-1507" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tim</text>
<polygon fill="none" stroke="#000000" points="263.348,-1426 263.348,-1494 338.348,-1494 338.348,-1426 263.348,-1426"/>
<text text-anchor="start" x="274.738" y="-1475" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">build_msg()</text>
<text text-anchor="start" x="278.072" y="-1463" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">recv_req()</text>
<text text-anchor="start" x="275.572" y="-1451" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">recv_resp()</text>
<text text-anchor="start" x="285.8505" y="-1439" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A15&#45;&gt;A9 -->
<g id="edge23" class="edge">
<title>A15&#45;&gt;A9</title>
<path fill="none" stroke="#000000" d="M315.5861,-1415.2689C317.0212,-1402.3918 318.4833,-1389.272 319.9365,-1376.2329"/>
<polygon fill="#000000" stroke="#000000" points="314.4417,-1425.5379 311.077,-1415.101 314.9955,-1420.5687 315.5493,-1415.5995 315.5493,-1415.5995 315.5493,-1415.5995 314.9955,-1420.5687 320.0217,-1416.0979 314.4417,-1425.5379 314.4417,-1425.5379"/>
<text text-anchor="middle" x="326.3292" y="-1392.1837" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
<text text-anchor="middle" x="308.049" y="-1403.5871" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A15&#45;&gt;A10 -->
<g id="edge22" class="edge">
<title>A15&#45;&gt;A10</title>
<path fill="none" stroke="#000000" d="M257.1725,-1475.7757C245.6828,-1458.4941 232.4915,-1440.871 218.348,-1426 192.2483,-1398.5578 171.9188,-1406.411 149.348,-1376 141.2346,-1365.0684 134.273,-1352.8227 128.315,-1340.1269"/>
<polygon fill="#000000" stroke="#000000" points="262.6729,-1484.2184 253.4437,-1478.2962 259.9435,-1480.0291 257.2141,-1475.8397 257.2141,-1475.8397 257.2141,-1475.8397 259.9435,-1480.0291 260.9845,-1473.3833 262.6729,-1484.2184 262.6729,-1484.2184"/>
<text text-anchor="middle" x="143.7688" y="-1349.8225" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
<text text-anchor="middle" x="245.6964" y="-1470.645" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 37 KiB

49
app/proxy_2.yuml Normal file
View File

@@ -0,0 +1,49 @@
// {type:class}
// {direction:topDown}
// {generate:true}
[note: You can stick notes on diagrams too!{bg:cornsilk}]
[IterRegistry||__iter__]
[InverterG3|addr;remote:StreamPtr;local:StreamPtr|async_create_remote();;close()]
[InverterG3P|addr;remote:StreamPtr;local:StreamPtr|async_create_remote();;close()]
[<<AsyncIfc>>||set_node_id();get_conn_no();;tx_add();tx_flush();tx_get();tx_peek();tx_log();tx_clear();tx_len();;fwd_add();fwd_flush();fwd_log();fwd_clear();rx_get();rx_peek();rx_log();rx_clear();rx_len();rx_set_cb();;prot_set_timeout_cb()]
[AsyncIfcImpl|fwd_fifo:ByteFifo;tx_fifo:ByteFifo;rx_fifo:ByteFifo;conn_no:Count;node_id;timeout_cb]
[AsyncStream|reader;writer;addr;r_addr;l_addr|;<async>loop;disc();close();healthy();;__async_read();__async_write();__async_forward()]
[AsyncStreamServer|async_create_remote|<async>server_loop();<async>_async_forward();<async>publish_outstanding_mqtt();close()]
[AsyncStreamClient||<async>client_loop();<async>_async_forward())]
[<<AsyncIfc>>]^-.-[AsyncIfcImpl]
[AsyncIfcImpl]^[AsyncStream]
[AsyncStream]^[AsyncStreamServer]
[AsyncStream]^[AsyncStreamClient]
[Talent|ifc:AsyncIfc;conn_no;addr;;await_conn_resp_cnt;id_str;contact_name;contact_mail;db:InfosG3;mb:Modbus;switch|msg_contact_info();msg_ota_update();msg_get_time();msg_collector_data();msg_inverter_data();msg_unknown();;healthy();close()]
[Talent]<remote-[InverterG3]
[InverterG3]-remote>[AsyncStreamClient]
[Talent]<-local++[InverterG3]
[InverterG3]++local->[AsyncStreamServer]
[SolarmanV5|ifc:AsyncIfc;conn_no;addr;;control;serial;snr;db:InfosG3P;mb:Modbus;switch|msg_unknown();;healthy();close()]
[SolarmanV5]<remote-[InverterG3P]
[InverterG3P]-remote>[AsyncStreamClient]
[SolarmanV5]<-local++[InverterG3P]
[InverterG3P]++local->[AsyncStreamServer]
[Infos|stat;new_stat_data;info_dev|static_init();dev_value();inc_counter();dec_counter();ha_proxy_conf;ha_conf;ha_remove;update_db;set_db_def_value;get_db_value;ignore_this_device]
[Infos]^[InfosG3||ha_confs();parse()]
[Infos]^[InfosG3P||ha_confs();parse()]
[Talent]use->[<<AsyncIfc>>]
[Talent]->[InfosG3]
[SolarmanV5]use->[<<AsyncIfc>>]
[SolarmanV5]->[InfosG3P]
[IterRegistry]^[Message|node_id|inc_counter();dec_counter()]
[Message]^[Talent]
[Message]^[SolarmanV5]
[Modbus|que;;snd_handler;rsp_handler;timeout;max_retires;last_xxx;err;retry_cnt;req_pend;tim|build_msg();recv_req();recv_resp();close()]
[Modbus]<1-has[SolarmanV5]
[Modbus]<1-has[Talent]

View File

@@ -1,35 +1,13 @@
import logging
from asyncio import StreamReader, StreamWriter
if __name__ == "app.src.gen3.inverter_g3":
from app.src.inverter_base import InverterBase
from app.src.async_stream import StreamPtr
from app.src.async_stream import AsyncStreamServer
from app.src.gen3.talent import Talent
else: # pragma: no cover
from inverter_base import InverterBase
from async_stream import StreamPtr
from async_stream import AsyncStreamServer
from gen3.talent import Talent
logger_mqtt = logging.getLogger('mqtt')
class InverterG3(InverterBase):
def __init__(self, reader: StreamReader, writer: StreamWriter, addr):
super().__init__()
self.addr = addr
self.remote = StreamPtr(None)
ifc = AsyncStreamServer(reader, writer,
self.async_publ_mqtt,
self.async_create_remote,
self.remote)
self.local = StreamPtr(
Talent(addr, ifc, True, False), ifc
)
async def async_create_remote(self) -> None:
await InverterBase.async_create_remote(
self, 'tsun', Talent)
def __init__(self, reader: StreamReader, writer: StreamWriter):
super().__init__(reader, writer, 'tsun', Talent)

View File

@@ -1,36 +1,15 @@
import logging
from asyncio import StreamReader, StreamWriter
if __name__ == "app.src.gen3plus.inverter_g3p":
from app.src.inverter_base import InverterBase
from app.src.async_stream import StreamPtr
from app.src.async_stream import AsyncStreamServer
from app.src.gen3plus.solarman_v5 import SolarmanV5
else: # pragma: no cover
from inverter_base import InverterBase
from async_stream import StreamPtr
from async_stream import AsyncStreamServer
from gen3plus.solarman_v5 import SolarmanV5
logger_mqtt = logging.getLogger('mqtt')
class InverterG3P(InverterBase):
def __init__(self, reader: StreamReader, writer: StreamWriter, addr,
def __init__(self, reader: StreamReader, writer: StreamWriter,
client_mode: bool = False):
super().__init__()
self.addr = addr
self.remote = StreamPtr(None)
ifc = AsyncStreamServer(reader, writer,
self.async_publ_mqtt,
self.async_create_remote,
self.remote)
self.local = StreamPtr(
SolarmanV5(addr, ifc, True, client_mode), ifc
)
async def async_create_remote(self) -> None:
await InverterBase.async_create_remote(
self, 'solarman', SolarmanV5)
super().__init__(reader, writer, 'solarman',
SolarmanV5, client_mode)

View File

@@ -3,15 +3,20 @@ import logging
import traceback
import json
from aiomqtt import MqttCodeError
from asyncio import StreamReader, StreamWriter
if __name__ == "app.src.inverter_base":
from app.src.inverter import Inverter
from app.src.async_stream import StreamPtr
from app.src.async_stream import AsyncStreamClient
from app.src.async_stream import AsyncStreamServer
from app.src.config import Config
from app.src.infos import Infos
else: # pragma: no cover
from inverter import Inverter
from async_stream import StreamPtr
from async_stream import AsyncStreamClient
from async_stream import AsyncStreamServer
from config import Config
from infos import Infos
@@ -19,9 +24,23 @@ logger_mqtt = logging.getLogger('mqtt')
class InverterBase(Inverter):
def __init__(self):
def __init__(self, reader: StreamReader, writer: StreamWriter,
config_id: str, prot_class,
client_mode: bool = False):
super().__init__()
self.addr = writer.get_extra_info('peername')
self.config_id = config_id
self.prot_class = prot_class
self.__ha_restarts = -1
self.remote = StreamPtr(None)
ifc = AsyncStreamServer(reader, writer,
self.async_publ_mqtt,
self.async_create_remote,
self.remote)
self.local = StreamPtr(
self.prot_class(self.addr, ifc, True, client_mode), ifc
)
def __enter__(self):
return self
@@ -66,9 +85,10 @@ class InverterBase(Inverter):
return False
return True
async def async_create_remote(self, inv_prot: str, conn_class) -> None:
async def async_create_remote(self) -> None:
'''Establish a client connection to the TSUN cloud'''
tsun = Config.get(inv_prot)
tsun = Config.get(self.config_id)
host = tsun['host']
port = tsun['port']
addr = (host, port)
@@ -83,11 +103,11 @@ class InverterBase(Inverter):
self.remote.ifc = ifc
if hasattr(stream, 'id_str'):
self.remote.stream = conn_class(
self.remote.stream = self.prot_class(
addr, ifc, server_side=False,
client_mode=False, id_str=stream.id_str)
else:
self.remote.stream = conn_class(
self.remote.stream = self.prot_class(
addr, ifc, server_side=False,
client_mode=False)

View File

@@ -25,7 +25,7 @@ class ModbusConn():
'''Establish a client connection to the TSUN cloud'''
connection = asyncio.open_connection(self.host, self.port)
reader, writer = await connection
self.inverter = InverterG3P(reader, writer, self.addr,
self.inverter = InverterG3P(reader, writer,
client_mode=True)
self.inverter.__enter__()
stream = self.inverter.local.stream

View File

@@ -72,8 +72,7 @@ async def webserver(addr, port):
async def handle_client(reader: StreamReader, writer: StreamWriter, inv_class):
'''Handles a new incoming connection and starts an async loop'''
addr = writer.get_extra_info('peername')
with inv_class(reader, writer, addr) as inv:
with inv_class(reader, writer) as inv:
await inv.local.ifc.server_loop()

View File

@@ -0,0 +1,241 @@
# test_with_pytest.py
import pytest
import asyncio
import sys,gc
import weakref
from mock import patch
from enum import Enum
from app.src.infos import Infos
from app.src.config import Config
from app.src.inverter import Inverter
from app.src.singleton import Singleton
from app.src.protocol_ifc import ProtocolIfc
from app.src.inverter_base import InverterBase
from app.src.messages import Message
from app.src.async_stream import AsyncStream
from app.tests.test_modbus_tcp import patch_mqtt_err, patch_mqtt_except, test_port, test_hostname
pytest_plugins = ('pytest_asyncio',)
# initialize the proxy statistics
Infos.static_init()
@pytest.fixture
def config_conn():
Config.act_config = {
'mqtt':{
'host': test_hostname,
'port': test_port,
'user': '',
'passwd': ''
},
'ha':{
'auto_conf_prefix': 'homeassistant',
'discovery_prefix': 'homeassistant',
'entity_prefix': 'tsun',
'proxy_node_id': 'test_1',
'proxy_unique_id': ''
},
'tsun':{'enabled': True, 'host': 'test_cloud.local', 'port': 1234}, 'inverters':{'allow_all':True}
}
@pytest.fixture(scope="module", autouse=True)
def module_init():
Singleton._instances.clear()
yield
class FakeProtocol(ProtocolIfc):
def __init__(self, addr, ifc, server_side: bool,
client_mode: bool = False, id_str=b''):
# self._registry.append(weakref.ref(self))
pass # empty mockup
def close(self):
pass # empty mockup
class FakeReader():
def __init__(self):
self.on_recv = asyncio.Event()
async def read(self, max_len: int):
await self.on_recv.wait()
return b''
def feed_eof(self):
return
class FakeWriter():
def write(self, buf: bytes):
return
def get_extra_info(self, sel: str):
if sel == 'peername':
return 'remote.intern'
elif sel == 'sockname':
return 'sock:1234'
assert False
def is_closing(self):
return False
def close(self):
return
async def wait_closed(self):
return
class TestType(Enum):
RD_TEST_0_BYTES = 1
RD_TEST_TIMEOUT = 2
RD_TEST_EXCEPT = 3
test = TestType.RD_TEST_0_BYTES
@pytest.fixture
def patch_open_connection():
async def new_conn(conn):
await asyncio.sleep(0)
return FakeReader(), FakeWriter()
def new_open(host: str, port: int):
global test
if test == TestType.RD_TEST_TIMEOUT:
raise ConnectionRefusedError
elif test == TestType.RD_TEST_EXCEPT:
raise ValueError("Value cannot be negative") # Compliant
return new_conn(None)
with patch.object(asyncio, 'open_connection', new_open) as conn:
yield conn
@pytest.fixture
def get_test_inverter():
reader = FakeReader()
writer = FakeWriter()
with InverterBase(reader, writer, 'tsun', FakeProtocol) as inverter:
yield inverter
@pytest.fixture
def patch_healthy():
with patch.object(AsyncStream, 'healthy') as conn:
yield conn
def test_method_calls(get_test_inverter, patch_healthy):
spy = patch_healthy
with get_test_inverter as inverter:
assert inverter.local.stream
assert inverter.local.ifc
for inv in Inverter:
inv.healthy()
del inv
spy.assert_called_once()
del inverter
cnt = 0
for inv in Inverter:
print(f'inv:{gc.get_referrers()}')
cnt += 1
assert cnt == 0
@pytest.mark.asyncio
async def test_remote_conn(config_conn, patch_open_connection):
_ = config_conn
_ = patch_open_connection
assert asyncio.get_running_loop()
with InverterBase(FakeReader(), FakeWriter()) as inverter:
await inverter.async_create_remote()
await asyncio.sleep(0)
assert inverter.remote.stream
del inverter
cnt = 0
for inv in Inverter:
print(f'Inverter refs:{gc.get_referrers(inv)}')
cnt += 1
assert cnt == 0
@pytest.mark.asyncio
async def test_remote_except(config_conn, patch_open_connection):
_ = config_conn
_ = patch_open_connection
assert asyncio.get_running_loop()
global test
test = TestType.RD_TEST_TIMEOUT
with InverterBase(FakeReader(), FakeWriter()) as inverter:
await inverter.async_create_remote()
await asyncio.sleep(0)
assert inverter.remote.stream==None
test = TestType.RD_TEST_EXCEPT
await inverter.async_create_remote()
await asyncio.sleep(0)
assert inverter.remote.stream==None
del inverter
cnt = 0
for inv in Inverter:
print(f'Inverter refs:{gc.get_referrers(inv)}')
cnt += 1
assert cnt == 0
@pytest.mark.asyncio
async def test_mqtt_publish(config_conn, patch_open_connection):
_ = config_conn
_ = patch_open_connection
assert asyncio.get_running_loop()
Inverter.class_init()
with InverterBase(FakeReader(), FakeWriter()) as inverter:
stream = inverter.local.stream
await inverter.async_publ_mqtt() # check call with invalid unique_id
stream._Talent__set_serial_no(serial_no= "123344")
stream.new_data['inverter'] = True
stream.db.db['inverter'] = {}
await inverter.async_publ_mqtt()
assert stream.new_data['inverter'] == False
stream.new_data['env'] = True
stream.db.db['env'] = {}
await inverter.async_publ_mqtt()
assert stream.new_data['env'] == False
Infos.new_stat_data['proxy'] = True
await inverter.async_publ_mqtt()
assert Infos.new_stat_data['proxy'] == False
@pytest.mark.asyncio
async def test_mqtt_err(config_conn, patch_open_connection, patch_mqtt_err):
_ = config_conn
_ = patch_open_connection
_ = patch_mqtt_err
assert asyncio.get_running_loop()
Inverter.class_init()
with InverterBase(FakeReader(), FakeWriter()) as inverter:
stream = inverter.local.stream
stream._Talent__set_serial_no(serial_no= "123344")
stream.new_data['inverter'] = True
stream.db.db['inverter'] = {}
await inverter.async_publ_mqtt()
assert stream.new_data['inverter'] == True
@pytest.mark.asyncio
async def test_mqtt_except(config_conn, patch_open_connection, patch_mqtt_except):
_ = config_conn
_ = patch_open_connection
_ = patch_mqtt_except
assert asyncio.get_running_loop()
Inverter.class_init()
with InverterBase(FakeReader(), FakeWriter()) as inverter:
stream = inverter.local.stream
stream._Talent__set_serial_no(serial_no= "123344")
stream.new_data['inverter'] = True
stream.db.db['inverter'] = {}
await inverter.async_publ_mqtt()
assert stream.new_data['inverter'] == True

View File

@@ -103,8 +103,9 @@ def test_method_calls(patch_healthy):
spy = patch_healthy
reader = FakeReader()
writer = FakeWriter()
addr = ('proxy.local', 10000)
with InverterG3(reader, writer, addr) as inverter:
Inverter._registry.clear()
with InverterG3(reader, writer) as inverter:
assert inverter.local.stream
assert inverter.local.ifc
for inv in Inverter:
@@ -123,7 +124,7 @@ async def test_remote_conn(config_conn, patch_open_connection):
_ = patch_open_connection
assert asyncio.get_running_loop()
with InverterG3(FakeReader(), FakeWriter(), ('proxy.local', 10000)) as inverter:
with InverterG3(FakeReader(), FakeWriter()) as inverter:
await inverter.async_create_remote()
await asyncio.sleep(0)
assert inverter.remote.stream
@@ -144,7 +145,7 @@ async def test_remote_except(config_conn, patch_open_connection):
global test
test = TestType.RD_TEST_TIMEOUT
with InverterG3(FakeReader(), FakeWriter(), ('proxy.local', 10000)) as inverter:
with InverterG3(FakeReader(), FakeWriter()) as inverter:
await inverter.async_create_remote()
await asyncio.sleep(0)
assert inverter.remote.stream==None
@@ -169,7 +170,7 @@ async def test_mqtt_publish(config_conn, patch_open_connection):
Inverter.class_init()
with InverterG3(FakeReader(), FakeWriter(), ('proxy.local', 10000)) as inverter:
with InverterG3(FakeReader(), FakeWriter()) as inverter:
stream = inverter.local.stream
await inverter.async_publ_mqtt() # check call with invalid unique_id
stream._Talent__set_serial_no(serial_no= "123344")
@@ -197,7 +198,7 @@ async def test_mqtt_err(config_conn, patch_open_connection, patch_mqtt_err):
Inverter.class_init()
with InverterG3(FakeReader(), FakeWriter(), ('proxy.local', 10000)) as inverter:
with InverterG3(FakeReader(), FakeWriter()) as inverter:
stream = inverter.local.stream
stream._Talent__set_serial_no(serial_no= "123344")
stream.new_data['inverter'] = True
@@ -214,7 +215,7 @@ async def test_mqtt_except(config_conn, patch_open_connection, patch_mqtt_except
Inverter.class_init()
with InverterG3(FakeReader(), FakeWriter(), ('proxy.local', 10000)) as inverter:
with InverterG3(FakeReader(), FakeWriter()) as inverter:
stream = inverter.local.stream
stream._Talent__set_serial_no(serial_no= "123344")

View File

@@ -96,8 +96,9 @@ def patch_open_connection():
def test_method_calls():
reader = FakeReader()
writer = FakeWriter()
addr = ('proxy.local', 10000)
with InverterG3P(reader, writer, addr, client_mode=False) as inverter:
Inverter._registry.clear()
with InverterG3P(reader, writer, client_mode=False) as inverter:
assert inverter.local.stream
assert inverter.local.ifc
@@ -107,7 +108,7 @@ async def test_remote_conn(config_conn, patch_open_connection):
_ = patch_open_connection
assert asyncio.get_running_loop()
with InverterG3P(FakeReader(), FakeWriter(), ('proxy.local', 10000), client_mode=False) as inverter:
with InverterG3P(FakeReader(), FakeWriter(), client_mode=False) as inverter:
await inverter.async_create_remote()
await asyncio.sleep(0)
assert inverter.remote.stream
@@ -121,7 +122,7 @@ async def test_remote_except(config_conn, patch_open_connection):
global test
test = TestType.RD_TEST_TIMEOUT
with InverterG3P(FakeReader(), FakeWriter(), ('proxy.local', 10000), client_mode=False) as inverter:
with InverterG3P(FakeReader(), FakeWriter(), client_mode=False) as inverter:
await inverter.async_create_remote()
await asyncio.sleep(0)
assert inverter.remote.stream==None
@@ -139,7 +140,7 @@ async def test_mqtt_publish(config_conn, patch_open_connection):
Inverter.class_init()
with InverterG3P(FakeReader(), FakeWriter(), ('proxy.local', 10000), client_mode=False) as inverter:
with InverterG3P(FakeReader(), FakeWriter(), client_mode=False) as inverter:
stream = inverter.local.stream
await inverter.async_publ_mqtt() # check call with invalid unique_id
stream._SolarmanV5__set_serial_no(snr= 123344)
@@ -167,7 +168,7 @@ async def test_mqtt_err(config_conn, patch_open_connection, patch_mqtt_err):
Inverter.class_init()
with InverterG3P(FakeReader(), FakeWriter(), ('proxy.local', 10000), client_mode=False) as inverter:
with InverterG3P(FakeReader(), FakeWriter(), client_mode=False) as inverter:
stream = inverter.local.stream
stream._SolarmanV5__set_serial_no(snr= 123344)
stream.new_data['inverter'] = True
@@ -184,7 +185,7 @@ async def test_mqtt_except(config_conn, patch_open_connection, patch_mqtt_except
Inverter.class_init()
with InverterG3P(FakeReader(), FakeWriter(), ('proxy.local', 10000), client_mode=False) as inverter:
with InverterG3P(FakeReader(), FakeWriter(), client_mode=False) as inverter:
stream = inverter.local.stream
stream._SolarmanV5__set_serial_no(snr= 123344)

View File

@@ -93,11 +93,13 @@ class FakeReader():
class FakeWriter():
def __init__(self, conn='remote.intern'):
self.conn = conn
def write(self, buf: bytes):
return
def get_extra_info(self, sel: str):
if sel == 'peername':
return 'remote.intern'
return self.conn
elif sel == 'sockname':
return 'sock:1234'
assert False
@@ -113,13 +115,13 @@ class FakeWriter():
def patch_open():
async def new_conn(conn):
await asyncio.sleep(0)
return FakeReader(), FakeWriter()
return FakeReader(), FakeWriter(conn)
def new_open(host: str, port: int):
global test
if test == TestType.RD_TEST_TIMEOUT:
raise TimeoutError
return new_conn(None)
return new_conn(f'{host}:{port}')
with patch.object(asyncio, 'open_connection', new_open) as conn:
yield conn
@@ -153,7 +155,7 @@ async def test_modbus_conn(patch_open):
async with ModbusConn('test.local', 1234) as inverter:
stream = inverter.local.stream
assert stream.node_id == 'G3P'
assert stream.addr == ('test.local', 1234)
assert stream.addr == ('test.local:1234')
assert type(stream.ifc._reader) is FakeReader
assert type(stream.ifc._writer) is FakeWriter
assert Infos.stat['proxy']['Inverter_Cnt'] == 1