move StremPtr instances into Inverter class

This commit is contained in:
Stefan Allius
2024-09-29 15:31:14 +02:00
parent 0c824b4a2a
commit 5a0ef30ceb
13 changed files with 548 additions and 550 deletions

View File

@@ -4,579 +4,587 @@
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: G Pages: 1 -->
<svg width="846pt" height="1784pt"
viewBox="0.00 0.00 846.00 1784.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 1780)">
<svg width="1122pt" height="1796pt"
viewBox="0.00 0.00 1122.00 1796.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 1792)">
<title>G</title>
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-1780 842,-1780 842,4 -4,4"/>
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-1792 1118,-1792 1118,4 -4,4"/>
<!-- A0 -->
<g id="node1" class="node">
<title>A0</title>
<polygon fill="#fff8dc" stroke="#000000" points="495.6964,-1752 387.3036,-1752 387.3036,-1716 501.6964,-1716 501.6964,-1746 495.6964,-1752"/>
<polyline fill="none" stroke="#000000" points="495.6964,-1752 495.6964,-1746 "/>
<polyline fill="none" stroke="#000000" points="501.6964,-1746 495.6964,-1746 "/>
<text text-anchor="middle" x="444.5" y="-1737" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">You can stick notes</text>
<text text-anchor="middle" x="444.5" y="-1725" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">on diagrams too!</text>
<polygon fill="#fff8dc" stroke="#000000" points="395.6964,-1764 287.3036,-1764 287.3036,-1728 401.6964,-1728 401.6964,-1758 395.6964,-1764"/>
<polyline fill="none" stroke="#000000" points="395.6964,-1764 395.6964,-1758 "/>
<polyline fill="none" stroke="#000000" points="401.6964,-1758 395.6964,-1758 "/>
<text text-anchor="middle" x="344.5" y="-1749" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">You can stick notes</text>
<text text-anchor="middle" x="344.5" y="-1737" 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="118.5,-572 118.5,-616 240.5,-616 240.5,-572 118.5,-572"/>
<text text-anchor="start" x="169.777" y="-597" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Mqtt</text>
<text text-anchor="start" x="146.9815" y="-585" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;&lt;Singleton&gt;&gt;</text>
<polygon fill="none" stroke="#000000" points="118.5,-516 118.5,-572 240.5,-572 240.5,-516 118.5,-516"/>
<text text-anchor="start" x="136.9875" y="-553" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;static&gt;ha_restarts</text>
<text text-anchor="start" x="144.7665" y="-541" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;static&gt;__client</text>
<text text-anchor="start" x="128.3735" y="-529" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;static&gt;__cb_MqttIsUp</text>
<polygon fill="none" stroke="#000000" points="118.5,-472 118.5,-516 240.5,-516 240.5,-472 118.5,-472"/>
<text text-anchor="start" x="141.436" y="-497" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;publish()</text>
<text text-anchor="start" x="145.6045" y="-485" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;close()</text>
<polygon fill="none" stroke="#000000" points="618.5,-584 618.5,-628 740.5,-628 740.5,-584 618.5,-584"/>
<text text-anchor="start" x="669.777" y="-609" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Mqtt</text>
<text text-anchor="start" x="646.9815" y="-597" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;&lt;Singleton&gt;&gt;</text>
<polygon fill="none" stroke="#000000" points="618.5,-528 618.5,-584 740.5,-584 740.5,-528 618.5,-528"/>
<text text-anchor="start" x="636.9875" y="-565" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;static&gt;ha_restarts</text>
<text text-anchor="start" x="644.7665" y="-553" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;static&gt;__client</text>
<text text-anchor="start" x="628.3735" y="-541" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;static&gt;__cb_MqttIsUp</text>
<polygon fill="none" stroke="#000000" points="618.5,-484 618.5,-528 740.5,-528 740.5,-484 618.5,-484"/>
<text text-anchor="start" x="641.436" y="-509" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;publish()</text>
<text text-anchor="start" x="645.6045" y="-497" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;close()</text>
</g>
<!-- A2 -->
<g id="node3" class="node">
<title>A2</title>
<polygon fill="none" stroke="#000000" points="125.5,-342 125.5,-374 233.5,-374 233.5,-342 125.5,-342"/>
<text text-anchor="start" x="162.5535" y="-355" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Inverter</text>
<polygon fill="none" stroke="#000000" points="125.5,-250 125.5,-342 233.5,-342 233.5,-250 125.5,-250"/>
<text text-anchor="start" x="155.604" y="-323" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.db_stat</text>
<text text-anchor="start" x="148.9405" y="-311" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.entity_prfx</text>
<text text-anchor="start" x="139.7755" y="-299" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.discovery_prfx</text>
<text text-anchor="start" x="139.2115" y="-287" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.proxy_node_id</text>
<text text-anchor="start" x="135.3225" y="-275" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.proxy_unique_id</text>
<text text-anchor="start" x="151.1655" y="-263" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.mqtt:Mqtt</text>
<polygon fill="none" stroke="#000000" points="125.5,-230 125.5,-250 233.5,-250 233.5,-230 125.5,-230"/>
<polygon fill="none" stroke="#000000" points="531.5,-372 531.5,-404 827.5,-404 827.5,-372 531.5,-372"/>
<text text-anchor="start" x="662.5535" y="-385" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Inverter</text>
<polygon fill="none" stroke="#000000" points="531.5,-256 531.5,-372 827.5,-372 827.5,-256 531.5,-256"/>
<text text-anchor="start" x="655.604" y="-353" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.db_stat</text>
<text text-anchor="start" x="648.9405" y="-341" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.entity_prfx</text>
<text text-anchor="start" x="639.7755" y="-329" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.discovery_prfx</text>
<text text-anchor="start" x="639.2115" y="-317" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.proxy_node_id</text>
<text text-anchor="start" x="635.3225" y="-305" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.proxy_unique_id</text>
<text text-anchor="start" x="651.1655" y="-293" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.mqtt:Mqtt</text>
<text text-anchor="start" x="648.9355" y="-269" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__ha_restarts</text>
<polygon fill="none" stroke="#000000" points="531.5,-224 531.5,-256 827.5,-256 827.5,-224 531.5,-224"/>
<text text-anchor="start" x="541.418" y="-237" 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;A2 -->
<g id="edge3" class="edge">
<title>A1&#45;&gt;A2</title>
<path fill="none" stroke="#000000" d="M179.5,-461.4521C179.5,-437.2513 179.5,-410.7602 179.5,-386.443"/>
<polygon fill="#000000" stroke="#000000" points="179.5,-471.7198 175.0001,-461.7198 179.5,-466.7198 179.5001,-461.7198 179.5001,-461.7198 179.5001,-461.7198 179.5,-466.7198 184.0001,-461.7199 179.5,-471.7198 179.5,-471.7198"/>
<polygon fill="#000000" stroke="#000000" points="179.5001,-386.3256 175.5,-380.3256 179.5,-374.3256 183.5,-380.3256 179.5001,-386.3256"/>
<path fill="none" stroke="#000000" d="M679.5,-473.6239C679.5,-455.2436 679.5,-435.5349 679.5,-416.4562"/>
<polygon fill="#000000" stroke="#000000" points="679.5,-483.7198 675.0001,-473.7198 679.5,-478.7198 679.5001,-473.7198 679.5001,-473.7198 679.5001,-473.7198 679.5,-478.7198 684.0001,-473.7199 679.5,-483.7198 679.5,-483.7198"/>
<polygon fill="#000000" stroke="#000000" points="679.5001,-416.3545 675.5,-410.3545 679.5,-404.3545 683.5,-410.3545 679.5001,-416.3545"/>
</g>
<!-- A3 -->
<g id="node4" class="node">
<title>A3</title>
<polygon fill="none" stroke="#000000" points="284.5,-100 284.5,-132 406.5,-132 406.5,-100 284.5,-100"/>
<text text-anchor="start" x="321.8845" y="-113" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InverterG3</text>
<polygon fill="none" stroke="#000000" points="284.5,-68 284.5,-100 406.5,-100 406.5,-68 284.5,-68"/>
<text text-anchor="start" x="314.9355" y="-81" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__ha_restarts</text>
<polygon fill="none" stroke="#000000" points="284.5,0 284.5,-68 406.5,-68 406.5,0 284.5,0"/>
<text text-anchor="start" x="294.1035" y="-49" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote()</text>
<text text-anchor="start" x="304.382" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_publ_mqtt()</text>
<text text-anchor="start" x="330.5025" y="-13" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<polygon fill="none" stroke="#000000" points="848.5,-112 848.5,-144 970.5,-144 970.5,-112 848.5,-112"/>
<text text-anchor="start" x="885.8845" y="-125" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InverterG3</text>
<polygon fill="none" stroke="#000000" points="848.5,-56 848.5,-112 970.5,-112 970.5,-56 848.5,-56"/>
<text text-anchor="start" x="899.497" y="-93" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="870.053" y="-81" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote:StreamPtr</text>
<text text-anchor="start" x="875.332" y="-69" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local:StreamPtr</text>
<polygon fill="none" stroke="#000000" points="848.5,0 848.5,-56 970.5,-56 970.5,0 848.5,0"/>
<text text-anchor="start" x="858.1035" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote()</text>
<text text-anchor="start" x="894.5025" y="-13" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A2&#45;&gt;A3 -->
<g id="edge1" class="edge">
<title>A2&#45;&gt;A3</title>
<path fill="none" stroke="#000000" d="M218.7146,-220.7402C226.0884,-207.4676 234.13,-194.1098 242.5,-182 254.9036,-164.0543 269.7696,-145.8518 284.2981,-129.3516"/>
<polygon fill="none" stroke="#000000" points="215.4351,-219.4436 213.7205,-229.8988 221.5808,-222.7948 215.4351,-219.4436"/>
<path fill="none" stroke="#000000" d="M772.305,-216.353C797.8541,-189.4709 824.9226,-160.9901 848.2041,-136.494"/>
<polygon fill="none" stroke="#000000" points="769.4956,-214.2284 765.1435,-223.8881 774.5696,-219.0508 769.4956,-214.2284"/>
</g>
<!-- A4 -->
<g id="node5" class="node">
<title>A4</title>
<polygon fill="none" stroke="#000000" points="120.5,-94 120.5,-126 239.5,-126 239.5,-94 120.5,-94"/>
<text text-anchor="start" x="153.05" y="-107" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InverterG3P</text>
<polygon fill="none" stroke="#000000" points="120.5,-62 120.5,-94 239.5,-94 239.5,-62 120.5,-62"/>
<text text-anchor="start" x="149.4355" y="-75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__ha_restarts</text>
<polygon fill="none" stroke="#000000" points="120.5,-6 120.5,-62 239.5,-62 239.5,-6 120.5,-6"/>
<text text-anchor="start" x="130.268" y="-43" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote(</text>
<text text-anchor="start" x="137.2175" y="-31" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">)async_publ_mqtt()</text>
<text text-anchor="start" x="165.0025" y="-19" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<polygon fill="none" stroke="#000000" points="154.5,-112 154.5,-144 276.5,-144 276.5,-112 154.5,-112"/>
<text text-anchor="start" x="188.55" y="-125" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InverterG3P</text>
<polygon fill="none" stroke="#000000" points="154.5,-56 154.5,-112 276.5,-112 276.5,-56 154.5,-56"/>
<text text-anchor="start" x="205.497" y="-93" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="176.053" y="-81" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote:StreamPtr</text>
<text text-anchor="start" x="181.332" y="-69" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">local:StreamPtr</text>
<polygon fill="none" stroke="#000000" points="154.5,0 154.5,-56 276.5,-56 276.5,0 154.5,0"/>
<text text-anchor="start" x="164.1035" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote()</text>
<text text-anchor="start" x="200.5025" y="-13" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A2&#45;&gt;A4 -->
<g id="edge2" class="edge">
<title>A2&#45;&gt;A4</title>
<path fill="none" stroke="#000000" d="M179.5,-219.6269C179.5,-188.8617 179.5,-154.5312 179.5,-126.1395"/>
<polygon fill="none" stroke="#000000" points="176.0001,-219.9098 179.5,-229.9099 183.0001,-219.9099 176.0001,-219.9098"/>
<path fill="none" stroke="#000000" d="M565.0086,-218.095C551.1965,-209.0983 536.8765,-200.8147 522.5,-194 435.4135,-152.7199 398.7736,-184.883 311.5,-144 299.6145,-138.4323 287.7649,-131.2444 276.6534,-123.5711"/>
<polygon fill="none" stroke="#000000" points="563.277,-221.1471 573.539,-223.7821 567.1601,-215.3228 563.277,-221.1471"/>
</g>
<!-- A5 -->
<g id="node6" class="node">
<title>A5</title>
<polygon fill="none" stroke="#000000" points="520.5,-1744 520.5,-1776 591.5,-1776 591.5,-1744 520.5,-1744"/>
<text text-anchor="start" x="530.445" y="-1757" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">IterRegistry</text>
<polygon fill="none" stroke="#000000" points="520.5,-1724 520.5,-1744 591.5,-1744 591.5,-1724 520.5,-1724"/>
<polygon fill="none" stroke="#000000" points="520.5,-1692 520.5,-1724 591.5,-1724 591.5,-1692 520.5,-1692"/>
<text text-anchor="start" x="537.939" y="-1705" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__iter__</text>
<polygon fill="none" stroke="#000000" points="420.5,-1756 420.5,-1788 491.5,-1788 491.5,-1756 420.5,-1756"/>
<text text-anchor="start" x="430.445" y="-1769" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">IterRegistry</text>
<polygon fill="none" stroke="#000000" points="420.5,-1736 420.5,-1756 491.5,-1756 491.5,-1736 420.5,-1736"/>
<polygon fill="none" stroke="#000000" points="420.5,-1704 420.5,-1736 491.5,-1736 491.5,-1704 420.5,-1704"/>
<text text-anchor="start" x="437.939" y="-1717" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__iter__</text>
</g>
<!-- A6 -->
<g id="node7" class="node">
<title>A6</title>
<polygon fill="none" stroke="#000000" points="488.5,-1610 488.5,-1642 622.5,-1642 622.5,-1610 488.5,-1610"/>
<text text-anchor="start" x="535.2175" y="-1623" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Message</text>
<polygon fill="none" stroke="#000000" points="488.5,-1434 488.5,-1610 622.5,-1610 622.5,-1434 488.5,-1434"/>
<text text-anchor="start" x="518.8265" y="-1591" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">server_side:bool</text>
<text text-anchor="start" x="516.043" y="-1579" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">header_valid:bool</text>
<text text-anchor="start" x="508.814" y="-1567" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">header_len:unsigned</text>
<text text-anchor="start" x="514.648" y="-1555" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">data_len:unsigned</text>
<text text-anchor="start" x="533.8245" y="-1543" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">unique_id</text>
<text text-anchor="start" x="537.7135" y="-1531" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">node_id</text>
<text text-anchor="start" x="534.6585" y="-1519" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">sug_area</text>
<text text-anchor="start" x="505.489" y="-1507" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_recv_buffer:bytearray</text>
<text text-anchor="start" x="504.0945" y="-1495" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_send_buffer:bytearray</text>
<text text-anchor="start" x="498.2665" y="-1483" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_forward_buffer:bytearray</text>
<text text-anchor="start" x="537.7135" y="-1471" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:Infos</text>
<text text-anchor="start" x="526.326" y="-1459" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">new_data:list</text>
<text text-anchor="start" x="544.662" y="-1447" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">state</text>
<polygon fill="none" stroke="#000000" points="488.5,-1366 488.5,-1434 622.5,-1434 622.5,-1366 488.5,-1366"/>
<text text-anchor="start" x="505.2095" y="-1415" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_read():void&lt;abstract&gt;</text>
<text text-anchor="start" x="529.9445" y="-1403" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close():void</text>
<text text-anchor="start" x="515.7725" y="-1391" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">inc_counter():void</text>
<text text-anchor="start" x="514.1025" y="-1379" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dec_counter():void</text>
<polygon fill="none" stroke="#000000" points="388.5,-1622 388.5,-1654 522.5,-1654 522.5,-1622 388.5,-1622"/>
<text text-anchor="start" x="435.2175" y="-1635" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Message</text>
<polygon fill="none" stroke="#000000" points="388.5,-1446 388.5,-1622 522.5,-1622 522.5,-1446 388.5,-1446"/>
<text text-anchor="start" x="418.8265" y="-1603" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">server_side:bool</text>
<text text-anchor="start" x="416.043" y="-1591" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">header_valid:bool</text>
<text text-anchor="start" x="408.814" y="-1579" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">header_len:unsigned</text>
<text text-anchor="start" x="414.648" y="-1567" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">data_len:unsigned</text>
<text text-anchor="start" x="433.8245" y="-1555" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">unique_id</text>
<text text-anchor="start" x="437.7135" y="-1543" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">node_id</text>
<text text-anchor="start" x="434.6585" y="-1531" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">sug_area</text>
<text text-anchor="start" x="405.489" y="-1519" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_recv_buffer:bytearray</text>
<text text-anchor="start" x="404.0945" y="-1507" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_send_buffer:bytearray</text>
<text text-anchor="start" x="398.2665" y="-1495" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_forward_buffer:bytearray</text>
<text text-anchor="start" x="437.7135" y="-1483" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:Infos</text>
<text text-anchor="start" x="426.326" y="-1471" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">new_data:list</text>
<text text-anchor="start" x="444.662" y="-1459" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">state</text>
<polygon fill="none" stroke="#000000" points="388.5,-1378 388.5,-1446 522.5,-1446 522.5,-1378 388.5,-1378"/>
<text text-anchor="start" x="405.2095" y="-1427" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_read():void&lt;abstract&gt;</text>
<text text-anchor="start" x="429.9445" y="-1415" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close():void</text>
<text text-anchor="start" x="415.7725" y="-1403" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">inc_counter():void</text>
<text text-anchor="start" x="414.1025" y="-1391" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dec_counter():void</text>
</g>
<!-- A5&#45;&gt;A6 -->
<g id="edge4" class="edge">
<title>A5&#45;&gt;A6</title>
<path fill="none" stroke="#000000" d="M555.5,-1681.5582C555.5,-1669.4749 555.5,-1656.067 555.5,-1642.189"/>
<polygon fill="none" stroke="#000000" points="552.0001,-1681.8144 555.5,-1691.8145 559.0001,-1681.8145 552.0001,-1681.8144"/>
<path fill="none" stroke="#000000" d="M455.5,-1693.5582C455.5,-1681.4749 455.5,-1668.067 455.5,-1654.189"/>
<polygon fill="none" stroke="#000000" points="452.0001,-1693.8144 455.5,-1703.8145 459.0001,-1693.8145 452.0001,-1693.8144"/>
</g>
<!-- A21 -->
<g id="node22" class="node">
<title>A21</title>
<polygon fill="none" stroke="#000000" points="498.5,-1284 498.5,-1316 612.5,-1316 612.5,-1284 498.5,-1284"/>
<text text-anchor="start" x="541.608" y="-1297" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Talent</text>
<polygon fill="none" stroke="#000000" points="498.5,-1180 498.5,-1284 612.5,-1284 612.5,-1180 498.5,-1180"/>
<text text-anchor="start" x="508.263" y="-1265" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">await_conn_resp_cnt</text>
<text text-anchor="start" x="543.2775" y="-1253" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">id_str</text>
<text text-anchor="start" x="524.1" y="-1241" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">contact_name</text>
<text text-anchor="start" x="527.44" y="-1229" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">contact_mail</text>
<text text-anchor="start" x="531.0445" y="-1217" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:InfosG3</text>
<text text-anchor="start" x="529.384" y="-1205" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">mb:Modbus</text>
<text text-anchor="start" x="541.612" y="-1193" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">switch</text>
<polygon fill="none" stroke="#000000" points="498.5,-1064 498.5,-1180 612.5,-1180 612.5,-1064 498.5,-1064"/>
<text text-anchor="start" x="512.9925" y="-1161" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_contact_info()</text>
<text text-anchor="start" x="514.9325" y="-1149" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_ota_update()</text>
<text text-anchor="start" x="520.7765" y="-1137" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_get_time()</text>
<text text-anchor="start" x="508.8285" y="-1125" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_collector_data()</text>
<text text-anchor="start" x="510.7735" y="-1113" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_inverter_data()</text>
<text text-anchor="start" x="519.9405" y="-1101" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_unknown()</text>
<text text-anchor="start" x="540.5025" y="-1077" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<polygon fill="none" stroke="#000000" points="520.5,-1296 520.5,-1328 634.5,-1328 634.5,-1296 520.5,-1296"/>
<text text-anchor="start" x="563.608" y="-1309" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Talent</text>
<polygon fill="none" stroke="#000000" points="520.5,-1192 520.5,-1296 634.5,-1296 634.5,-1192 520.5,-1192"/>
<text text-anchor="start" x="530.263" y="-1277" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">await_conn_resp_cnt</text>
<text text-anchor="start" x="565.2775" y="-1265" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">id_str</text>
<text text-anchor="start" x="546.1" y="-1253" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">contact_name</text>
<text text-anchor="start" x="549.44" y="-1241" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">contact_mail</text>
<text text-anchor="start" x="553.0445" y="-1229" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:InfosG3</text>
<text text-anchor="start" x="551.384" y="-1217" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">mb:Modbus</text>
<text text-anchor="start" x="563.612" y="-1205" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">switch</text>
<polygon fill="none" stroke="#000000" points="520.5,-1076 520.5,-1192 634.5,-1192 634.5,-1076 520.5,-1076"/>
<text text-anchor="start" x="534.9925" y="-1173" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_contact_info()</text>
<text text-anchor="start" x="536.9325" y="-1161" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_ota_update()</text>
<text text-anchor="start" x="542.7765" y="-1149" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_get_time()</text>
<text text-anchor="start" x="530.8285" y="-1137" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_collector_data()</text>
<text text-anchor="start" x="532.7735" y="-1125" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_inverter_data()</text>
<text text-anchor="start" x="541.9405" y="-1113" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_unknown()</text>
<text text-anchor="start" x="562.5025" y="-1089" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A6&#45;&gt;A21 -->
<g id="edge29" class="edge">
<title>A6&#45;&gt;A21</title>
<path fill="none" stroke="#000000" d="M555.5,-1355.7632C555.5,-1342.5854 555.5,-1329.3251 555.5,-1316.355"/>
<polygon fill="none" stroke="#000000" points="552.0001,-1355.8181 555.5,-1365.8181 559.0001,-1355.8181 552.0001,-1355.8181"/>
<path fill="none" stroke="#000000" d="M512.9446,-1368.1508C518.1142,-1354.8455 523.3179,-1341.4522 528.4067,-1328.355"/>
<polygon fill="none" stroke="#000000" points="509.5478,-1367.2293 509.1885,-1377.8181 516.0726,-1369.7645 509.5478,-1367.2293"/>
</g>
<!-- A22 -->
<g id="node23" class="node">
<title>A22</title>
<polygon fill="none" stroke="#000000" points="387.5,-1248 387.5,-1280 478.5,-1280 478.5,-1248 387.5,-1248"/>
<text text-anchor="start" x="405.495" y="-1261" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">SolarmanV5</text>
<polygon fill="none" stroke="#000000" points="387.5,-1156 387.5,-1248 478.5,-1248 478.5,-1156 387.5,-1156"/>
<text text-anchor="start" x="417.998" y="-1229" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">control</text>
<text text-anchor="start" x="421.0575" y="-1217" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">serial</text>
<text text-anchor="start" x="426.056" y="-1205" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">snr</text>
<text text-anchor="start" x="405.21" y="-1193" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:InfosG3P</text>
<text text-anchor="start" x="406.884" y="-1181" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">mb:Modbus</text>
<text text-anchor="start" x="419.112" y="-1169" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">switch</text>
<polygon fill="none" stroke="#000000" points="387.5,-1100 387.5,-1156 478.5,-1156 478.5,-1100 387.5,-1100"/>
<text text-anchor="start" x="397.4405" y="-1137" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_unknown()</text>
<text text-anchor="start" x="418.0025" y="-1113" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<polygon fill="none" stroke="#000000" points="411.5,-1260 411.5,-1292 502.5,-1292 502.5,-1260 411.5,-1260"/>
<text text-anchor="start" x="429.495" y="-1273" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">SolarmanV5</text>
<polygon fill="none" stroke="#000000" points="411.5,-1168 411.5,-1260 502.5,-1260 502.5,-1168 411.5,-1168"/>
<text text-anchor="start" x="441.998" y="-1241" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">control</text>
<text text-anchor="start" x="445.0575" y="-1229" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">serial</text>
<text text-anchor="start" x="450.056" y="-1217" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">snr</text>
<text text-anchor="start" x="429.21" y="-1205" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:InfosG3P</text>
<text text-anchor="start" x="430.884" y="-1193" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">mb:Modbus</text>
<text text-anchor="start" x="443.112" y="-1181" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">switch</text>
<polygon fill="none" stroke="#000000" points="411.5,-1112 411.5,-1168 502.5,-1168 502.5,-1112 411.5,-1112"/>
<text text-anchor="start" x="421.4405" y="-1149" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_unknown()</text>
<text text-anchor="start" x="442.0025" y="-1125" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A6&#45;&gt;A22 -->
<g id="edge30" class="edge">
<title>A6&#45;&gt;A22</title>
<path fill="none" stroke="#000000" d="M497.6392,-1356.2903C487.487,-1330.3733 477.2021,-1304.1174 467.8962,-1280.3611"/>
<polygon fill="none" stroke="#000000" points="494.4651,-1357.7836 501.3714,-1365.8181 500.9829,-1355.2304 494.4651,-1357.7836"/>
<path fill="none" stroke="#000000" d="M455.9726,-1367.6082C456.0544,-1341.9128 456.1372,-1315.9091 456.2122,-1292.3611"/>
<polygon fill="none" stroke="#000000" points="452.472,-1367.807 455.9401,-1377.8181 459.472,-1367.8293 452.472,-1367.807"/>
</g>
<!-- A7 -->
<g id="node8" class="node">
<title>A7</title>
<polygon fill="none" stroke="#000000" points="552.5,-982 552.5,-1014 669.5,-1014 669.5,-982 552.5,-982"/>
<text text-anchor="start" x="580.429" 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="552.5,-962 552.5,-982 669.5,-982 669.5,-962 552.5,-962"/>
<polygon fill="none" stroke="#000000" points="552.5,-666 552.5,-962 669.5,-962 669.5,-666 552.5,-666"/>
<text text-anchor="start" x="580.436" y="-943" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">set_node_id()</text>
<text text-anchor="start" x="578.766" y="-931" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">get_conn_no()</text>
<text text-anchor="start" x="592.6635" y="-907" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_add()</text>
<text text-anchor="start" x="590.444" y="-895" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_flush()</text>
<text text-anchor="start" x="594.0535" y="-883" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_get()</text>
<text text-anchor="start" x="590.1635" y="-871" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_peek()</text>
<text text-anchor="start" x="594.3335" y="-859" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_log()</text>
<text text-anchor="start" x="590.169" y="-847" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_clear()</text>
<text text-anchor="start" x="594.3335" y="-835" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_len()</text>
<text text-anchor="start" x="588.7745" y="-811" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_add()</text>
<text text-anchor="start" x="586.555" y="-799" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_flush()</text>
<text text-anchor="start" x="590.4445" y="-787" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_log()</text>
<text text-anchor="start" x="586.28" y="-775" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_clear()</text>
<text text-anchor="start" x="593.7785" y="-763" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_get()</text>
<text text-anchor="start" x="589.8885" y="-751" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_peek()</text>
<text text-anchor="start" x="594.0585" y="-739" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_log()</text>
<text text-anchor="start" x="589.894" y="-727" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_clear()</text>
<text text-anchor="start" x="594.0585" y="-715" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_len()</text>
<text text-anchor="start" x="585.999" y="-703" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_set_cb()</text>
<text text-anchor="start" x="562.3795" y="-679" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">prot_set_timeout_cb()</text>
<polygon fill="none" stroke="#000000" points="410.5,-994 410.5,-1026 527.5,-1026 527.5,-994 410.5,-994"/>
<text text-anchor="start" x="438.429" y="-1007" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;&lt;AsyncIfc&gt;&gt;</text>
<polygon fill="none" stroke="#000000" points="410.5,-974 410.5,-994 527.5,-994 527.5,-974 410.5,-974"/>
<polygon fill="none" stroke="#000000" points="410.5,-678 410.5,-974 527.5,-974 527.5,-678 410.5,-678"/>
<text text-anchor="start" x="438.436" y="-955" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">set_node_id()</text>
<text text-anchor="start" x="436.766" y="-943" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">get_conn_no()</text>
<text text-anchor="start" x="450.6635" y="-919" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_add()</text>
<text text-anchor="start" x="448.444" y="-907" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_flush()</text>
<text text-anchor="start" x="452.0535" y="-895" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_get()</text>
<text text-anchor="start" x="448.1635" y="-883" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_peek()</text>
<text text-anchor="start" x="452.3335" y="-871" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_log()</text>
<text text-anchor="start" x="448.169" y="-859" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_clear()</text>
<text text-anchor="start" x="452.3335" y="-847" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_len()</text>
<text text-anchor="start" x="446.7745" y="-823" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_add()</text>
<text text-anchor="start" x="444.555" y="-811" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_flush()</text>
<text text-anchor="start" x="448.4445" y="-799" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_log()</text>
<text text-anchor="start" x="444.28" y="-787" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_clear()</text>
<text text-anchor="start" x="451.7785" y="-775" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_get()</text>
<text text-anchor="start" x="447.8885" y="-763" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_peek()</text>
<text text-anchor="start" x="452.0585" y="-751" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_log()</text>
<text text-anchor="start" x="447.894" y="-739" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_clear()</text>
<text text-anchor="start" x="452.0585" y="-727" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_len()</text>
<text text-anchor="start" x="443.999" y="-715" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_set_cb()</text>
<text text-anchor="start" x="420.3795" y="-691" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">prot_set_timeout_cb()</text>
</g>
<!-- A8 -->
<g id="node9" class="node">
<title>A8</title>
<polygon fill="none" stroke="#000000" points="575.5,-574 575.5,-606 668.5,-606 668.5,-574 575.5,-574"/>
<text text-anchor="start" x="593.664" y="-587" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncIfcImpl</text>
<polygon fill="none" stroke="#000000" points="575.5,-482 575.5,-574 668.5,-574 668.5,-482 575.5,-482"/>
<text text-anchor="start" x="585.048" y="-555" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_fifo:ByteFifo</text>
<text text-anchor="start" x="588.937" y="-543" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_fifo:ByteFifo</text>
<text text-anchor="start" x="588.662" y="-531" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_fifo:ByteFifo</text>
<text text-anchor="start" x="588.096" y="-519" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">conn_no:Count</text>
<text text-anchor="start" x="604.2135" y="-507" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">node_id</text>
<text text-anchor="start" x="597.5495" y="-495" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">timeout_cb</text>
<polygon fill="none" stroke="#000000" points="422.5,-586 422.5,-618 515.5,-618 515.5,-586 422.5,-586"/>
<text text-anchor="start" x="440.664" y="-599" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncIfcImpl</text>
<polygon fill="none" stroke="#000000" points="422.5,-494 422.5,-586 515.5,-586 515.5,-494 422.5,-494"/>
<text text-anchor="start" x="432.048" y="-567" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_fifo:ByteFifo</text>
<text text-anchor="start" x="435.937" y="-555" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_fifo:ByteFifo</text>
<text text-anchor="start" x="435.662" y="-543" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_fifo:ByteFifo</text>
<text text-anchor="start" x="435.096" y="-531" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">conn_no:Count</text>
<text text-anchor="start" x="451.2135" y="-519" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">node_id</text>
<text text-anchor="start" x="444.5495" y="-507" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">timeout_cb</text>
</g>
<!-- A7&#45;&gt;A8 -->
<g id="edge5" class="edge">
<title>A7&#45;&gt;A8</title>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M617.3637,-655.3047C618.0135,-637.8196 618.6361,-621.0638 619.1922,-606.0999"/>
<polygon fill="none" stroke="#000000" points="613.8521,-655.5528 616.9783,-665.6759 620.8473,-655.8128 613.8521,-655.5528"/>
<path fill="none" stroke="#000000" stroke-dasharray="5,2" d="M468.5,-667.3047C468.5,-649.8196 468.5,-633.0638 468.5,-618.0999"/>
<polygon fill="none" stroke="#000000" points="465.0001,-667.6759 468.5,-677.6759 472.0001,-667.676 465.0001,-667.6759"/>
</g>
<!-- A9 -->
<g id="node10" class="node">
<title>A9</title>
<polygon fill="none" stroke="#000000" points="635.5,-390 635.5,-422 737.5,-422 737.5,-390 635.5,-390"/>
<text text-anchor="start" x="656.774" y="-403" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStream</text>
<polygon fill="none" stroke="#000000" points="635.5,-310 635.5,-390 737.5,-390 737.5,-310 635.5,-310"/>
<text text-anchor="start" x="672.053" y="-371" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">reader</text>
<text text-anchor="start" x="674.283" y="-359" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">writer</text>
<text text-anchor="start" x="676.497" y="-347" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="672.053" y="-335" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">r_addr</text>
<text text-anchor="start" x="672.608" y="-323" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">l_addr</text>
<polygon fill="none" stroke="#000000" points="635.5,-182 635.5,-310 737.5,-310 737.5,-182 635.5,-182"/>
<text text-anchor="start" x="658.154" y="-279" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;loop</text>
<text text-anchor="start" x="674.282" y="-267" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">disc()</text>
<text text-anchor="start" x="671.5025" y="-255" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<text text-anchor="start" x="667.054" y="-243" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<text text-anchor="start" x="651.7705" y="-219" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__async_read()</text>
<text text-anchor="start" x="651.221" y="-207" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__async_write()</text>
<text text-anchor="start" x="645.107" y="-195" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__async_forward()</text>
<polygon fill="none" stroke="#000000" points="411.5,-402 411.5,-434 513.5,-434 513.5,-402 411.5,-402"/>
<text text-anchor="start" x="432.774" y="-415" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStream</text>
<polygon fill="none" stroke="#000000" points="411.5,-322 411.5,-402 513.5,-402 513.5,-322 411.5,-322"/>
<text text-anchor="start" x="448.053" y="-383" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">reader</text>
<text text-anchor="start" x="450.283" y="-371" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">writer</text>
<text text-anchor="start" x="452.497" y="-359" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="448.053" y="-347" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">r_addr</text>
<text text-anchor="start" x="448.608" y="-335" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">l_addr</text>
<polygon fill="none" stroke="#000000" points="411.5,-194 411.5,-322 513.5,-322 513.5,-194 411.5,-194"/>
<text text-anchor="start" x="434.154" y="-291" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;loop</text>
<text text-anchor="start" x="450.282" y="-279" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">disc()</text>
<text text-anchor="start" x="447.5025" y="-267" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<text text-anchor="start" x="443.054" y="-255" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<text text-anchor="start" x="427.7705" y="-231" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__async_read()</text>
<text text-anchor="start" x="427.221" y="-219" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__async_write()</text>
<text text-anchor="start" x="421.107" y="-207" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__async_forward()</text>
</g>
<!-- A8&#45;&gt;A9 -->
<g id="edge6" class="edge">
<title>A8&#45;&gt;A9</title>
<path fill="none" stroke="#000000" d="M640.7492,-472.3339C644.9969,-456.5191 649.6091,-439.3476 654.2155,-422.1976"/>
<polygon fill="#000000" stroke="#000000" points="638.1547,-481.9932 636.4028,-471.1682 639.4518,-477.1644 640.7488,-472.3355 640.7488,-472.3355 640.7488,-472.3355 639.4518,-477.1644 645.0948,-473.5029 638.1547,-481.9932 638.1547,-481.9932"/>
<path fill="none" stroke="#000000" d="M466.712,-483.886C466.323,-468.1951 465.9013,-451.1858 465.4801,-434.1976"/>
<polygon fill="#000000" stroke="#000000" points="466.9626,-493.9932 462.2161,-484.1079 466.8387,-488.9948 466.7147,-483.9963 466.7147,-483.9963 466.7147,-483.9963 466.8387,-488.9948 471.2133,-483.8847 466.9626,-493.9932 466.9626,-493.9932"/>
</g>
<!-- A10 -->
<g id="node11" class="node">
<title>A10</title>
<polygon fill="none" stroke="#000000" points="436.5,-100 436.5,-132 614.5,-132 614.5,-100 436.5,-100"/>
<text text-anchor="start" x="481.0515" y="-113" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStreamServer</text>
<polygon fill="none" stroke="#000000" points="436.5,-68 436.5,-100 614.5,-100 614.5,-68 436.5,-68"/>
<text text-anchor="start" x="477.4325" y="-81" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote</text>
<polygon fill="none" stroke="#000000" points="436.5,0 436.5,-68 614.5,-68 614.5,0 436.5,0"/>
<text text-anchor="start" x="477.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="467.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="446.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="510.5025" y="-13" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<polygon fill="none" stroke="#000000" points="320.5,-106 320.5,-138 498.5,-138 498.5,-106 320.5,-106"/>
<text text-anchor="start" x="365.0515" y="-119" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStreamServer</text>
<polygon fill="none" stroke="#000000" points="320.5,-74 320.5,-106 498.5,-106 498.5,-74 320.5,-74"/>
<text text-anchor="start" x="361.4325" y="-87" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote</text>
<polygon fill="none" stroke="#000000" points="320.5,-6 320.5,-74 498.5,-74 498.5,-6 320.5,-6"/>
<text text-anchor="start" x="361.1575" y="-55" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;server_loop()</text>
<text text-anchor="start" x="351.9885" y="-43" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;_async_forward()</text>
<text text-anchor="start" x="330.309" y="-31" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;publish_outstanding_mqtt()</text>
<text text-anchor="start" x="394.5025" y="-19" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A9&#45;&gt;A10 -->
<g id="edge7" class="edge">
<title>A9&#45;&gt;A10</title>
<path fill="none" stroke="#000000" d="M629.9027,-187.1874C628.7765,-185.436 627.642,-183.7056 626.5,-182 615.1346,-165.026 601.5426,-147.838 588.0698,-132.0797"/>
<polygon fill="#000000" stroke="#000000" points="635.4599,-196.1027 626.3512,-189.9968 632.8149,-191.8595 630.17,-187.6163 630.17,-187.6163 630.17,-187.6163 632.8149,-191.8595 633.9889,-185.2359 635.4599,-196.1027 635.4599,-196.1027"/>
<path fill="none" stroke="#000000" d="M434.0002,-183.8689C430.5451,-168.0929 427.1356,-152.525 424.0085,-138.2463"/>
<polygon fill="#000000" stroke="#000000" points="436.1553,-193.709 429.62,-184.9033 435.0855,-188.8247 434.0158,-183.9405 434.0158,-183.9405 434.0158,-183.9405 435.0855,-188.8247 438.4116,-182.9778 436.1553,-193.709 436.1553,-193.709"/>
</g>
<!-- A11 -->
<g id="node12" class="node">
<title>A11</title>
<polygon fill="none" stroke="#000000" points="632.5,-82 632.5,-114 770.5,-114 770.5,-82 632.5,-82"/>
<text text-anchor="start" x="658.997" y="-95" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStreamClient</text>
<polygon fill="none" stroke="#000000" points="632.5,-62 632.5,-82 770.5,-82 770.5,-62 632.5,-62"/>
<polygon fill="none" stroke="#000000" points="632.5,-18 632.5,-62 770.5,-62 770.5,-18 632.5,-18"/>
<text text-anchor="start" x="655.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="642.324" y="-31" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;_async_forward())</text>
<polygon fill="none" stroke="#000000" points="516.5,-88 516.5,-120 654.5,-120 654.5,-88 516.5,-88"/>
<text text-anchor="start" x="542.997" y="-101" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStreamClient</text>
<polygon fill="none" stroke="#000000" points="516.5,-68 516.5,-88 654.5,-88 654.5,-68 516.5,-68"/>
<polygon fill="none" stroke="#000000" points="516.5,-24 516.5,-68 654.5,-68 654.5,-24 516.5,-24"/>
<text text-anchor="start" x="539.378" y="-49" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;client_loop()</text>
<text text-anchor="start" x="526.324" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;_async_forward())</text>
</g>
<!-- A9&#45;&gt;A11 -->
<g id="edge8" class="edge">
<title>A9&#45;&gt;A11</title>
<path fill="none" stroke="#000000" d="M694.7749,-171.8077C696.0812,-151.2556 697.3558,-131.2022 698.4379,-114.1772"/>
<polygon fill="#000000" stroke="#000000" points="694.1318,-181.9259 690.2753,-171.6605 694.449,-176.9359 694.7662,-171.946 694.7662,-171.946 694.7662,-171.946 694.449,-176.9359 699.2572,-172.2315 694.1318,-181.9259 694.1318,-181.9259"/>
<path fill="none" stroke="#000000" d="M518.2402,-202.3977C519.6727,-199.569 521.0944,-196.766 522.5,-194 534.9192,-169.5609 548.8938,-142.4596 560.5201,-120.0195"/>
<polygon fill="#000000" stroke="#000000" points="513.636,-211.505 514.1318,-200.5503 515.8919,-207.0428 518.1478,-202.5807 518.1478,-202.5807 518.1478,-202.5807 515.8919,-207.0428 522.1638,-204.611 513.636,-211.505 513.636,-211.505"/>
</g>
<!-- A12 -->
<g id="node13" class="node">
<title>A12</title>
<polygon fill="none" stroke="#000000" points="687.5,-856 687.5,-888 838.5,-888 838.5,-856 687.5,-856"/>
<text text-anchor="start" x="731.0455" y="-869" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3</text>
<polygon fill="none" stroke="#000000" points="687.5,-824 687.5,-856 838.5,-856 838.5,-824 687.5,-824"/>
<text text-anchor="start" x="697.432" y="-837" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote.stream:ConnectionG3</text>
<polygon fill="none" stroke="#000000" points="687.5,-792 687.5,-824 838.5,-824 838.5,-792 687.5,-792"/>
<text text-anchor="start" x="743.554" y="-805" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<polygon fill="none" stroke="#000000" points="834.5,-572 834.5,-604 985.5,-604 985.5,-572 834.5,-572"/>
<text text-anchor="start" x="878.0455" y="-585" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3</text>
<polygon fill="none" stroke="#000000" points="834.5,-540 834.5,-572 985.5,-572 985.5,-540 834.5,-540"/>
<text text-anchor="start" x="844.432" y="-553" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote.stream:ConnectionG3</text>
<polygon fill="none" stroke="#000000" points="834.5,-508 834.5,-540 985.5,-540 985.5,-508 834.5,-508"/>
<text text-anchor="start" x="890.554" y="-521" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
</g>
<!-- A13 -->
<g id="node14" class="node">
<title>A13</title>
<polygon fill="none" stroke="#000000" points="687.5,-560 687.5,-592 838.5,-592 838.5,-560 687.5,-560"/>
<text text-anchor="start" x="718.2685" y="-573" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3Client</text>
<polygon fill="none" stroke="#000000" points="687.5,-528 687.5,-560 838.5,-560 838.5,-528 687.5,-528"/>
<text text-anchor="start" x="697.432" y="-541" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote.stream:ConnectionG3</text>
<polygon fill="none" stroke="#000000" points="687.5,-496 687.5,-528 838.5,-528 838.5,-496 687.5,-496"/>
<text text-anchor="start" x="748.0025" y="-509" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<polygon fill="none" stroke="#000000" points="991.5,-342 991.5,-374 1114.5,-374 1114.5,-342 991.5,-342"/>
<text text-anchor="start" x="1008.2685" y="-355" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3Client</text>
<polygon fill="none" stroke="#000000" points="991.5,-286 991.5,-342 1114.5,-342 1114.5,-286 991.5,-286"/>
<text text-anchor="start" x="1001.329" y="-323" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_ifc:AsyncStreamClient</text>
<text text-anchor="start" x="1033.823" y="-311" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">conn_no</text>
<text text-anchor="start" x="1042.997" y="-299" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<polygon fill="none" stroke="#000000" points="991.5,-254 991.5,-286 1114.5,-286 1114.5,-254 991.5,-254"/>
<text text-anchor="start" x="1038.0025" y="-267" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A12&#45;&gt;A13 -->
<g id="edge9" class="edge">
<title>A12&#45;&gt;A13</title>
<path fill="none" stroke="#000000" d="M762.5,-781.767C762.5,-726.3695 762.5,-644.0054 762.5,-592.1957"/>
<polygon fill="none" stroke="#000000" points="759.0001,-781.7837 762.5,-791.7837 766.0001,-781.7837 759.0001,-781.7837"/>
<path fill="none" stroke="#000000" d="M943.5689,-499.3607C955.8855,-478.806 969.8661,-455.3836 982.5,-434 993.9712,-414.5844 1006.4007,-393.3438 1017.5584,-374.2012"/>
<polygon fill="none" stroke="#000000" points="940.5415,-497.6035 938.401,-507.9799 946.5451,-501.2032 940.5415,-497.6035"/>
</g>
<!-- A14 -->
<g id="node15" class="node">
<title>A14</title>
<polygon fill="none" stroke="#000000" points="466.5,-324 466.5,-356 617.5,-356 617.5,-324 466.5,-324"/>
<text text-anchor="start" x="495.323" y="-337" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3Server</text>
<polygon fill="none" stroke="#000000" points="466.5,-292 466.5,-324 617.5,-324 617.5,-292 466.5,-292"/>
<text text-anchor="start" x="476.432" y="-305" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote.stream:ConnectionG3</text>
<polygon fill="none" stroke="#000000" points="466.5,-248 466.5,-292 617.5,-292 617.5,-248 466.5,-248"/>
<text text-anchor="start" x="527.0025" y="-261" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<polygon fill="none" stroke="#000000" points="846.5,-348 846.5,-380 973.5,-380 973.5,-348 846.5,-348"/>
<text text-anchor="start" x="863.323" y="-361" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3Server</text>
<polygon fill="none" stroke="#000000" points="846.5,-292 846.5,-348 973.5,-348 973.5,-292 846.5,-292"/>
<text text-anchor="start" x="856.3835" y="-329" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_ifc:AsyncStreamServer</text>
<text text-anchor="start" x="890.823" y="-317" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">conn_no</text>
<text text-anchor="start" x="899.997" y="-305" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<polygon fill="none" stroke="#000000" points="846.5,-248 846.5,-292 973.5,-292 973.5,-248 846.5,-248"/>
<text text-anchor="start" x="895.0025" y="-261" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A12&#45;&gt;A14 -->
<g id="edge10" class="edge">
<title>A12&#45;&gt;A14</title>
<path fill="none" stroke="#000000" d="M745.971,-781.9742C732.8528,-744.797 711.2028,-697.74 678.5,-666 639.382,-628.0337 597.9598,-660.5189 566.5,-616 537.8593,-575.4705 537.2638,-434.5757 539.3427,-356.0029"/>
<polygon fill="none" stroke="#000000" points="742.7431,-783.3525 749.2852,-791.6862 749.368,-781.0917 742.7431,-783.3525"/>
<path fill="none" stroke="#000000" d="M909.5,-497.7294C909.5,-462.3516 909.5,-417.0849 909.5,-380.3357"/>
<polygon fill="none" stroke="#000000" points="906.0001,-497.8992 909.5,-507.8992 913.0001,-497.8993 906.0001,-497.8992"/>
</g>
<!-- A13&#45;&gt;A3 -->
<g id="edge11" class="edge">
<title>A13&#45;&gt;A3</title>
<path fill="none" stroke="#000000" d="M1017.5584,-253.7988C1006.4007,-234.6562 993.9712,-213.4156 982.5,-194 972.9579,-177.8494 962.6475,-160.5358 952.8661,-144.1731"/>
</g>
<!-- A13&#45;&gt;A11 -->
<g id="edge12" class="edge">
<title>A13&#45;&gt;A11</title>
<path fill="none" stroke="#000000" d="M765.7562,-483.9177C768.3319,-411.4858 768.4508,-286.4642 746.5,-182 742.3769,-162.3782 735.3279,-141.7356 728.0167,-123.3919"/>
<polygon fill="#000000" stroke="#000000" points="765.7548,-483.9554 769.5185,-490.1064 765.2883,-495.9463 761.5246,-489.7953 765.7548,-483.9554"/>
<polygon fill="#000000" stroke="#000000" points="724.1836,-114.0264 732.1361,-121.5768 726.0775,-118.6539 727.9715,-123.2813 727.9715,-123.2813 727.9715,-123.2813 726.0775,-118.6539 723.8068,-124.9858 724.1836,-114.0264 724.1836,-114.0264"/>
<text text-anchor="middle" x="738.872" y="-124.6003" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A13&#45;&gt;A14 -->
<g id="edge11" class="edge">
<title>A13&#45;&gt;A14</title>
<path fill="none" stroke="#000000" d="M698.7055,-489.1877C669.7319,-463.8077 639.1408,-436.1834 626.5,-422 608.4095,-401.7018 590.66,-377.5241 576.0987,-356.2077"/>
<polygon fill="#000000" stroke="#000000" points="706.4202,-495.9268 695.9285,-492.737 702.6546,-492.6374 698.889,-489.348 698.889,-489.348 698.889,-489.348 702.6546,-492.6374 701.8495,-485.9589 706.4202,-495.9268 706.4202,-495.9268"/>
<path fill="none" stroke="#000000" d="M1022.7322,-243.1642C1012.2734,-225.0469 998.9298,-207.0281 982.5,-194 969.732,-183.8755 776.9932,-127.2035 664.8513,-94.7795"/>
<polygon fill="#000000" stroke="#000000" points="1022.7956,-243.28 1029.1855,-246.622 1028.5583,-253.8058 1022.1684,-250.4638 1022.7956,-243.28"/>
<polygon fill="#000000" stroke="#000000" points="654.925,-91.912 665.7811,-90.3642 659.7285,-93.2997 664.5321,-94.6874 664.5321,-94.6874 664.5321,-94.6874 659.7285,-93.2997 663.2832,-99.0106 654.925,-91.912 654.925,-91.912"/>
<text text-anchor="middle" x="674.6849" y="-85.8223" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A14&#45;&gt;A3 -->
<g id="edge13" class="edge">
<title>A14&#45;&gt;A3</title>
<path fill="none" stroke="#000000" d="M490.0309,-240.027C462.4537,-206.8219 428.4748,-165.9084 400.3932,-132.0959"/>
<polygon fill="none" stroke="#000000" points="487.4521,-242.4001 496.5336,-247.8568 492.8371,-237.9278 487.4521,-242.4001"/>
<path fill="none" stroke="#000000" d="M909.5,-247.8724C909.5,-215.8251 909.5,-177.2624 909.5,-144.4235"/>
</g>
<!-- A14&#45;&gt;A10 -->
<g id="edge14" class="edge">
<title>A14&#45;&gt;A10</title>
<path fill="none" stroke="#000000" d="M537.0108,-235.7838C535.0371,-206.6727 532.7079,-172.3163 530.6628,-142.1514"/>
<polygon fill="#000000" stroke="#000000" points="537.0175,-235.8843 541.4142,-241.6 537.8293,-247.8568 533.4325,-242.1412 537.0175,-235.8843"/>
<polygon fill="#000000" stroke="#000000" points="529.9811,-132.0959 535.1473,-141.7686 530.3193,-137.0845 530.6576,-142.073 530.6576,-142.073 530.6576,-142.073 530.3193,-137.0845 526.1679,-142.3774 529.9811,-132.0959 529.9811,-132.0959"/>
<text text-anchor="middle" x="539.6402" y="-146.6088" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
<path fill="none" stroke="#000000" d="M876.5835,-237.3698C866.0629,-220.7173 852.8034,-204.8582 836.5,-194 713.4014,-112.0153 644.1696,-200.5349 507.5,-144 506.2929,-143.5007 505.0869,-142.9834 503.8826,-142.4494"/>
<polygon fill="#000000" stroke="#000000" points="876.6531,-237.4869 883.1568,-240.6018 882.7829,-247.8032 876.2792,-244.6883 876.6531,-237.4869"/>
<polygon fill="#000000" stroke="#000000" points="494.6952,-138.046 505.6579,-138.3101 499.2041,-140.2071 503.713,-142.3681 503.713,-142.3681 503.713,-142.3681 499.2041,-140.2071 501.7681,-146.4261 494.6952,-138.046 494.6952,-138.046"/>
<text text-anchor="middle" x="514.6941" y="-135.2581" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A15 -->
<g id="node16" class="node">
<title>A15</title>
<polygon fill="none" stroke="#000000" points="292.5,-862 292.5,-894 449.5,-894 449.5,-862 292.5,-862"/>
<text text-anchor="start" x="335.711" y="-875" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3P</text>
<polygon fill="none" stroke="#000000" points="292.5,-830 292.5,-862 449.5,-862 449.5,-830 292.5,-830"/>
<text text-anchor="start" x="302.0975" y="-843" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote.stream:ConnectionG3P</text>
<polygon fill="none" stroke="#000000" points="292.5,-786 292.5,-830 449.5,-830 449.5,-786 292.5,-786"/>
<text text-anchor="start" x="351.554" y="-811" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<text text-anchor="start" x="356.0025" y="-799" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<polygon fill="none" stroke="#000000" points="247.5,-578 247.5,-610 404.5,-610 404.5,-578 247.5,-578"/>
<text text-anchor="start" x="290.711" y="-591" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3P</text>
<polygon fill="none" stroke="#000000" points="247.5,-546 247.5,-578 404.5,-578 404.5,-546 247.5,-546"/>
<text text-anchor="start" x="257.0975" y="-559" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote.stream:ConnectionG3P</text>
<polygon fill="none" stroke="#000000" points="247.5,-502 247.5,-546 404.5,-546 404.5,-502 247.5,-502"/>
<text text-anchor="start" x="306.554" y="-527" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<text text-anchor="start" x="311.0025" y="-515" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A16 -->
<g id="node17" class="node">
<title>A16</title>
<polygon fill="none" stroke="#000000" points="359.5,-560 359.5,-592 516.5,-592 516.5,-560 359.5,-560"/>
<text text-anchor="start" x="389.934" y="-573" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3PClient</text>
<polygon fill="none" stroke="#000000" points="359.5,-528 359.5,-560 516.5,-560 516.5,-528 359.5,-528"/>
<text text-anchor="start" x="369.0975" y="-541" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote.stream:ConnectionG3P</text>
<polygon fill="none" stroke="#000000" points="359.5,-496 359.5,-528 516.5,-528 516.5,-496 359.5,-496"/>
<text text-anchor="start" x="423.0025" y="-509" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<polygon fill="none" stroke="#000000" points="270.5,-342 270.5,-374 393.5,-374 393.5,-342 270.5,-342"/>
<text text-anchor="start" x="283.934" y="-355" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3PClient</text>
<polygon fill="none" stroke="#000000" points="270.5,-286 270.5,-342 393.5,-342 393.5,-286 270.5,-286"/>
<text text-anchor="start" x="280.329" y="-323" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_ifc:AsyncStreamClient</text>
<text text-anchor="start" x="312.823" y="-311" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">conn_no</text>
<text text-anchor="start" x="321.997" y="-299" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<polygon fill="none" stroke="#000000" points="270.5,-254 270.5,-286 393.5,-286 393.5,-254 270.5,-254"/>
<text text-anchor="start" x="317.0025" y="-267" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A15&#45;&gt;A16 -->
<g id="edge15" class="edge">
<title>A15&#45;&gt;A16</title>
<path fill="none" stroke="#000000" d="M385.0601,-775.6747C397.5656,-720.4264 415.3156,-642.0086 426.6189,-592.0719"/>
<polygon fill="none" stroke="#000000" points="381.5829,-775.1831 382.7888,-785.709 388.4102,-776.7285 381.5829,-775.1831"/>
<path fill="none" stroke="#000000" d="M327.0879,-491.955C327.9924,-455.4743 329.1187,-410.045 330.007,-374.2187"/>
<polygon fill="none" stroke="#000000" points="323.5881,-491.908 326.839,-501.9917 330.5859,-492.0815 323.5881,-491.908"/>
</g>
<!-- A17 -->
<g id="node18" class="node">
<title>A17</title>
<polygon fill="none" stroke="#000000" points="252.5,-324 252.5,-356 409.5,-356 409.5,-324 252.5,-324"/>
<text text-anchor="start" x="280.9885" y="-337" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3PServer</text>
<polygon fill="none" stroke="#000000" points="252.5,-292 252.5,-324 409.5,-324 409.5,-292 252.5,-292"/>
<text text-anchor="start" x="262.0975" y="-305" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote.stream:ConnectionG3P</text>
<polygon fill="none" stroke="#000000" points="252.5,-248 252.5,-292 409.5,-292 409.5,-248 252.5,-248"/>
<text text-anchor="start" x="316.0025" y="-261" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<polygon fill="none" stroke="#000000" points="125.5,-348 125.5,-380 252.5,-380 252.5,-348 125.5,-348"/>
<text text-anchor="start" x="138.9885" y="-361" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3PServer</text>
<polygon fill="none" stroke="#000000" points="125.5,-292 125.5,-348 252.5,-348 252.5,-292 125.5,-292"/>
<text text-anchor="start" x="135.3835" y="-329" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_ifc:AsyncStreamServer</text>
<text text-anchor="start" x="169.823" y="-317" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">conn_no</text>
<text text-anchor="start" x="178.997" y="-305" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<polygon fill="none" stroke="#000000" points="125.5,-248 125.5,-292 252.5,-292 252.5,-248 125.5,-248"/>
<text text-anchor="start" x="174.0025" y="-261" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A15&#45;&gt;A17 -->
<g id="edge16" class="edge">
<title>A15&#45;&gt;A17</title>
<path fill="none" stroke="#000000" d="M363.8918,-775.579C359.4421,-730.8408 353.651,-669.833 349.5,-616 342.4777,-524.9291 336.5213,-418.8313 333.2353,-356.213"/>
<polygon fill="none" stroke="#000000" points="360.4287,-776.124 364.9058,-785.7264 367.394,-775.4279 360.4287,-776.124"/>
<path fill="none" stroke="#000000" d="M289.7929,-492.9261C270.2064,-458.3282 245.9384,-415.4605 226.0668,-380.3588"/>
<polygon fill="none" stroke="#000000" points="286.9527,-495.0137 294.925,-501.9917 293.0443,-491.5651 286.9527,-495.0137"/>
</g>
<!-- A16&#45;&gt;A4 -->
<g id="edge17" class="edge">
<title>A16&#45;&gt;A4</title>
<path fill="none" stroke="#000000" d="M302.6768,-253.8688C286.7742,-220.6928 266.9148,-179.2619 250.1691,-144.3269"/>
</g>
<!-- A16&#45;&gt;A11 -->
<g id="edge18" class="edge">
<title>A16&#45;&gt;A11</title>
<path fill="none" stroke="#000000" d="M432.5814,-483.65C426.5012,-392.955 420.8979,-227.2936 456.5,-182 504.3791,-121.0873 555.3805,-168.9121 623.5,-132 629.8263,-128.572 636.106,-124.5733 642.1952,-120.2709"/>
<polygon fill="#000000" stroke="#000000" points="432.5842,-483.6913 436.9918,-489.3986 433.4189,-495.6623 429.0112,-489.955 432.5842,-483.6913"/>
<polygon fill="#000000" stroke="#000000" points="650.3668,-114.2407 644.9924,-123.7993 646.3436,-117.2096 642.3205,-120.1784 642.3205,-120.1784 642.3205,-120.1784 646.3436,-117.2096 639.6485,-116.5576 650.3668,-114.2407 650.3668,-114.2407"/>
<text text-anchor="middle" x="640.8006" y="-128.8045" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A16&#45;&gt;A17 -->
<g id="edge17" class="edge">
<title>A16&#45;&gt;A17</title>
<path fill="none" stroke="#000000" d="M412.1504,-486.6673C394.7061,-447.2138 371.6786,-395.1329 354.5264,-356.3401"/>
<polygon fill="#000000" stroke="#000000" points="416.2323,-495.8992 408.0728,-488.5731 414.2104,-491.3263 412.1884,-486.7533 412.1884,-486.7533 412.1884,-486.7533 414.2104,-491.3263 416.3041,-484.9336 416.2323,-495.8992 416.2323,-495.8992"/>
<path fill="none" stroke="#000000" d="M364.237,-242.8926C374.6703,-225.3763 387.4809,-207.7268 402.5,-194 440.6532,-159.1296 464.6927,-172.9679 507.5,-144 515.1218,-138.8423 522.7381,-132.957 530.0611,-126.8244"/>
<polygon fill="#000000" stroke="#000000" points="363.993,-243.3208 364.4962,-250.5143 358.0496,-253.7456 357.5463,-246.5521 363.993,-243.3208"/>
<polygon fill="#000000" stroke="#000000" points="537.8784,-120.0954 533.2351,-130.0298 534.0889,-123.3573 530.2994,-126.6192 530.2994,-126.6192 530.2994,-126.6192 534.0889,-123.3573 527.3637,-123.2087 537.8784,-120.0954 537.8784,-120.0954"/>
<text text-anchor="middle" x="529.6548" y="-135.3265" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A17&#45;&gt;A4 -->
<g id="edge19" class="edge">
<title>A17&#45;&gt;A4</title>
<path fill="none" stroke="#000000" d="M290.2801,-239.1397C267.862,-204.1022 240.0902,-160.6973 217.9615,-126.112"/>
<polygon fill="none" stroke="#000000" points="287.5198,-241.3198 295.8575,-247.8568 293.4162,-237.5471 287.5198,-241.3198"/>
<path fill="none" stroke="#000000" d="M195.8779,-247.8724C199.4534,-215.8251 203.7558,-177.2624 207.4197,-144.4235"/>
</g>
<!-- A17&#45;&gt;A10 -->
<g id="edge20" class="edge">
<title>A17&#45;&gt;A10</title>
<path fill="none" stroke="#000000" d="M378.7264,-238.2577C392.9202,-219.9137 408.6333,-200.0024 423.5,-182 434.8823,-168.217 447.2524,-153.7473 459.3242,-139.8828"/>
<polygon fill="#000000" stroke="#000000" points="378.561,-238.4723 378.0657,-245.6664 371.2345,-247.9761 371.7298,-240.782 378.561,-238.4723"/>
<polygon fill="#000000" stroke="#000000" points="465.9919,-132.2508 462.8014,-142.7423 462.7022,-136.0162 459.4126,-139.7816 459.4126,-139.7816 459.4126,-139.7816 462.7022,-136.0162 456.0237,-136.8209 465.9919,-132.2508 465.9919,-132.2508"/>
<text text-anchor="middle" x="460.4315" y="-148.4623" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
<path fill="none" stroke="#000000" d="M229.091,-237.3362C238.5135,-222.3077 249.1431,-207.1448 260.5,-194 275.896,-176.1804 294.0998,-158.9307 312.4008,-143.2863"/>
<polygon fill="#000000" stroke="#000000" points="229.0208,-237.4513 229.3074,-244.6567 222.7665,-247.6926 222.4799,-240.4872 229.0208,-237.4513"/>
<polygon fill="#000000" stroke="#000000" points="320.2421,-136.6829 315.4917,-146.5665 316.4176,-139.9037 312.593,-143.1244 312.593,-143.1244 312.593,-143.1244 316.4176,-139.9037 309.6944,-139.6824 320.2421,-136.6829 320.2421,-136.6829"/>
<text text-anchor="middle" x="311.8219" y="-151.8241" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A18 -->
<g id="node19" class="node">
<title>A18</title>
<polygon fill="none" stroke="#000000" points="255.5,-1278 255.5,-1310 358.5,-1310 358.5,-1278 255.5,-1278"/>
<text text-anchor="start" x="296.162" y="-1291" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Infos</text>
<polygon fill="none" stroke="#000000" points="255.5,-1222 255.5,-1278 358.5,-1278 358.5,-1222 255.5,-1222"/>
<text text-anchor="start" x="298.9415" y="-1259" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">stat</text>
<text text-anchor="start" x="274.486" y="-1247" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">new_stat_data</text>
<text text-anchor="start" x="288.1035" y="-1235" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">info_dev</text>
<polygon fill="none" stroke="#000000" points="255.5,-1070 255.5,-1222 358.5,-1222 358.5,-1070 255.5,-1070"/>
<text text-anchor="start" x="282.8355" y="-1203" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">static_init()</text>
<text text-anchor="start" x="280.8845" y="-1191" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dev_value()</text>
<text text-anchor="start" x="277.8305" y="-1179" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">inc_counter()</text>
<text text-anchor="start" x="276.1605" y="-1167" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dec_counter()</text>
<text text-anchor="start" x="274.21" y="-1155" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_proxy_conf</text>
<text text-anchor="start" x="289.213" y="-1143" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_conf</text>
<text text-anchor="start" x="281.994" y="-1131" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_remove</text>
<text text-anchor="start" x="283.3745" y="-1119" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">update_db</text>
<text text-anchor="start" x="267.537" y="-1107" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">set_db_def_value</text>
<text text-anchor="start" x="276.9855" y="-1095" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">get_db_value</text>
<text text-anchor="start" x="265.3225" y="-1083" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ignore_this_device</text>
<polygon fill="none" stroke="#000000" points="663.5,-1290 663.5,-1322 766.5,-1322 766.5,-1290 663.5,-1290"/>
<text text-anchor="start" x="704.162" y="-1303" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Infos</text>
<polygon fill="none" stroke="#000000" points="663.5,-1234 663.5,-1290 766.5,-1290 766.5,-1234 663.5,-1234"/>
<text text-anchor="start" x="706.9415" y="-1271" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">stat</text>
<text text-anchor="start" x="682.486" y="-1259" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">new_stat_data</text>
<text text-anchor="start" x="696.1035" y="-1247" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">info_dev</text>
<polygon fill="none" stroke="#000000" points="663.5,-1082 663.5,-1234 766.5,-1234 766.5,-1082 663.5,-1082"/>
<text text-anchor="start" x="690.8355" y="-1215" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">static_init()</text>
<text text-anchor="start" x="688.8845" y="-1203" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dev_value()</text>
<text text-anchor="start" x="685.8305" y="-1191" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">inc_counter()</text>
<text text-anchor="start" x="684.1605" y="-1179" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dec_counter()</text>
<text text-anchor="start" x="682.21" y="-1167" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_proxy_conf</text>
<text text-anchor="start" x="697.213" y="-1155" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_conf</text>
<text text-anchor="start" x="689.994" y="-1143" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_remove</text>
<text text-anchor="start" x="691.3745" y="-1131" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">update_db</text>
<text text-anchor="start" x="675.537" y="-1119" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">set_db_def_value</text>
<text text-anchor="start" x="684.9855" y="-1107" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">get_db_value</text>
<text text-anchor="start" x="673.3225" y="-1095" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ignore_this_device</text>
</g>
<!-- A19 -->
<g id="node20" class="node">
<title>A19</title>
<polygon fill="none" stroke="#000000" points="467.5,-856 467.5,-888 534.5,-888 534.5,-856 467.5,-856"/>
<text text-anchor="start" x="483.493" y="-869" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InfosG3</text>
<polygon fill="none" stroke="#000000" points="467.5,-836 467.5,-856 534.5,-856 534.5,-836 467.5,-836"/>
<polygon fill="none" stroke="#000000" points="467.5,-792 467.5,-836 534.5,-836 534.5,-792 467.5,-792"/>
<text text-anchor="start" x="477.384" y="-817" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_confs()</text>
<text text-anchor="start" x="485.168" y="-805" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">parse()</text>
<polygon fill="none" stroke="#000000" points="686.5,-868 686.5,-900 753.5,-900 753.5,-868 686.5,-868"/>
<text text-anchor="start" x="702.493" y="-881" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InfosG3</text>
<polygon fill="none" stroke="#000000" points="686.5,-848 686.5,-868 753.5,-868 753.5,-848 686.5,-848"/>
<polygon fill="none" stroke="#000000" points="686.5,-804 686.5,-848 753.5,-848 753.5,-804 686.5,-804"/>
<text text-anchor="start" x="696.384" y="-829" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_confs()</text>
<text text-anchor="start" x="704.168" y="-817" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">parse()</text>
</g>
<!-- A18&#45;&gt;A19 -->
<g id="edge21" class="edge">
<title>A18&#45;&gt;A19</title>
<path fill="none" stroke="#000000" d="M364.1135,-1079.5989C368.3725,-1074.1218 372.8381,-1068.8788 377.5,-1064 406.4667,-1033.6857 432.8916,-1047.9478 457.5,-1014 484.2551,-977.0907 494.4701,-925.4423 498.3138,-888.0116"/>
<polygon fill="none" stroke="#000000" points="361.1895,-1077.6653 358.0224,-1087.7757 366.8031,-1081.8471 361.1895,-1077.6653"/>
<path fill="none" stroke="#000000" d="M716.3679,-1071.2448C717.2228,-1011.4063 718.1831,-944.1816 718.8124,-900.1352"/>
<polygon fill="none" stroke="#000000" points="712.864,-1071.5008 716.2207,-1081.5499 719.8633,-1071.6009 712.864,-1071.5008"/>
</g>
<!-- A20 -->
<g id="node21" class="node">
<title>A20</title>
<polygon fill="none" stroke="#000000" points="207.5,-856 207.5,-888 274.5,-888 274.5,-856 207.5,-856"/>
<text text-anchor="start" x="220.1585" y="-869" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InfosG3P</text>
<polygon fill="none" stroke="#000000" points="207.5,-836 207.5,-856 274.5,-856 274.5,-836 207.5,-836"/>
<polygon fill="none" stroke="#000000" points="207.5,-792 207.5,-836 274.5,-836 274.5,-792 207.5,-792"/>
<text text-anchor="start" x="217.384" y="-817" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_confs()</text>
<text text-anchor="start" x="225.168" y="-805" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">parse()</text>
<polygon fill="none" stroke="#000000" points="601.5,-868 601.5,-900 668.5,-900 668.5,-868 601.5,-868"/>
<text text-anchor="start" x="614.1585" y="-881" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InfosG3P</text>
<polygon fill="none" stroke="#000000" points="601.5,-848 601.5,-868 668.5,-868 668.5,-848 601.5,-848"/>
<polygon fill="none" stroke="#000000" points="601.5,-804 601.5,-848 668.5,-848 668.5,-804 601.5,-804"/>
<text text-anchor="start" x="611.384" y="-829" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_confs()</text>
<text text-anchor="start" x="619.168" y="-817" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">parse()</text>
</g>
<!-- A18&#45;&gt;A20 -->
<g id="edge22" class="edge">
<title>A18&#45;&gt;A20</title>
<path fill="none" stroke="#000000" d="M281.9132,-1059.6156C270.6119,-999.6842 257.9,-932.2726 249.5769,-888.1352"/>
<polygon fill="none" stroke="#000000" points="278.494,-1060.3716 283.7865,-1069.5499 285.3728,-1059.0744 278.494,-1060.3716"/>
<path fill="none" stroke="#000000" d="M684.6978,-1071.6156C670.9993,-1011.6842 655.5909,-944.2726 645.5023,-900.1352"/>
<polygon fill="none" stroke="#000000" points="681.3282,-1072.5812 686.9685,-1081.5499 688.1522,-1071.0214 681.3282,-1072.5812"/>
</g>
<!-- A21&#45;&gt;A7 -->
<g id="edge24" class="edge">
<title>A21&#45;&gt;A7</title>
<path fill="none" stroke="#000000" d="M575.3563,-1063.642C577.3669,-1050.8472 579.4367,-1037.6756 581.5179,-1024.4317"/>
<polygon fill="#000000" stroke="#000000" points="583.1108,-1014.295 586.0038,-1024.8724 582.3345,-1019.2344 581.5583,-1024.1738 581.5583,-1024.1738 581.5583,-1024.1738 582.3345,-1019.2344 577.1129,-1023.4752 583.1108,-1014.295 583.1108,-1014.295"/>
<text text-anchor="middle" x="569.8202" y="-1041.4234" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">use</text>
<path fill="none" stroke="#000000" d="M538.1485,-1075.642C534.1248,-1062.7218 529.9814,-1049.4173 525.816,-1036.0422"/>
<polygon fill="#000000" stroke="#000000" points="522.7805,-1026.295 530.0504,-1034.5047 524.2672,-1031.0689 525.754,-1035.8428 525.754,-1035.8428 525.754,-1035.8428 524.2672,-1031.0689 521.4575,-1037.1808 522.7805,-1026.295 522.7805,-1026.295"/>
<text text-anchor="middle" x="524.6887" y="-1057.8489" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">use</text>
</g>
<!-- A21&#45;&gt;A12 -->
<g id="edge23" class="edge">
<title>A21&#45;&gt;A12</title>
<path fill="none" stroke="#000000" d="M618.6601,-1105.4878C638.7912,-1077.0562 660.4946,-1044.7401 678.5,-1014 702.5743,-972.8987 725.7861,-923.8582 741.6852,-888.3319"/>
<polygon fill="none" stroke="#000000" points="615.6988,-1103.6125 612.7495,-1113.7886 621.4009,-1107.6728 615.6988,-1103.6125"/>
<path fill="none" stroke="#000000" d="M564.1559,-1065.9252C553.9277,-931.2452 548.1297,-736.9086 592.5,-678 636.5584,-619.5054 681.1086,-654.1797 749.5,-628 777.3788,-617.3282 807.3601,-604.2758 833.7487,-592.2292"/>
<polygon fill="none" stroke="#000000" points="560.6683,-1066.2219 564.9314,-1075.9212 567.6473,-1065.6804 560.6683,-1066.2219"/>
</g>
<!-- A21&#45;&gt;A19 -->
<g id="edge25" class="edge">
<title>A21&#45;&gt;A19</title>
<path fill="none" stroke="#000000" d="M535.6437,-1063.642C526.7659,-1007.1466 516.7335,-943.3043 509.6671,-898.3363"/>
<polygon fill="#000000" stroke="#000000" points="508.0718,-888.1839 514.0697,-897.3641 508.848,-893.1233 509.6242,-898.0627 509.6242,-898.0627 509.6242,-898.0627 508.848,-893.1233 505.1788,-898.7613 508.0718,-888.1839 508.0718,-888.1839"/>
<path fill="none" stroke="#000000" d="M634.5567,-1107.0461C653.1824,-1074.9161 670.8088,-1042.911 677.5,-1026 692.2769,-988.654 702.8382,-944.668 709.6743,-910.2651"/>
<polygon fill="#000000" stroke="#000000" points="711.5902,-900.3728 714.1066,-911.0461 710.6395,-905.2816 709.6887,-910.1904 709.6887,-910.1904 709.6887,-910.1904 710.6395,-905.2816 705.2708,-909.3347 711.5902,-900.3728 711.5902,-900.3728"/>
</g>
<!-- A22&#45;&gt;A7 -->
<g id="edge27" class="edge">
<title>A22&#45;&gt;A7</title>
<path fill="none" stroke="#000000" d="M468.0427,-1099.8226C474.4445,-1087.349 481.6217,-1075.043 489.5,-1064 508.3074,-1037.6376 524.3881,-1040.8449 542.5,-1014 543.9285,-1011.8827 545.3335,-1009.731 546.715,-1007.5491"/>
<polygon fill="#000000" stroke="#000000" points="551.9277,-998.9917 550.5685,-1009.873 549.3265,-1003.2618 546.7254,-1007.532 546.7254,-1007.532 546.7254,-1007.532 549.3265,-1003.2618 542.8822,-1005.1909 551.9277,-998.9917 551.9277,-998.9917"/>
<text text-anchor="middle" x="468.9105" y="-1076.8414" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">use</text>
<path fill="none" stroke="#000000" d="M459.5903,-1111.8663C460.3908,-1088.5184 461.2825,-1062.5112 462.1837,-1036.2257"/>
<polygon fill="#000000" stroke="#000000" points="462.5294,-1026.1428 466.684,-1036.2912 462.358,-1031.1399 462.1866,-1036.137 462.1866,-1036.137 462.1866,-1036.137 462.358,-1031.1399 457.6893,-1035.9827 462.5294,-1026.1428 462.5294,-1026.1428"/>
<text text-anchor="middle" x="451.764" y="-1090.4612" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">use</text>
</g>
<!-- A22&#45;&gt;A15 -->
<g id="edge26" class="edge">
<title>A22&#45;&gt;A15</title>
<path fill="none" stroke="#000000" d="M414.749,-1089.7927C403.4687,-1026.1139 389.3056,-946.1607 380.0853,-894.1104"/>
<polygon fill="none" stroke="#000000" points="411.3428,-1090.6301 416.5335,-1099.8663 418.2355,-1089.4091 411.3428,-1090.6301"/>
<path fill="none" stroke="#000000" d="M421.8613,-1102.1122C414.0976,-1077.4347 406.4188,-1050.9251 400.5,-1026 365.1821,-877.2711 341.7422,-698.0529 331.457,-610.0829"/>
<polygon fill="none" stroke="#000000" points="418.5872,-1103.3659 424.9536,-1111.8347 425.258,-1101.2442 418.5872,-1103.3659"/>
</g>
<!-- A22&#45;&gt;A20 -->
<g id="edge28" class="edge">
<title>A22&#45;&gt;A20</title>
<path fill="none" stroke="#000000" d="M393.1989,-1099.7863C385.4244,-1086.9738 376.5183,-1074.5787 366.5,-1064 336.6255,-1032.4545 308.2844,-1048.9681 282.5,-1014 257.8033,-980.507 247.4516,-934.4437 243.1951,-898.1251"/>
<polygon fill="#000000" stroke="#000000" points="242.1493,-888.1583 247.6684,-897.6341 242.6711,-893.131 243.1929,-898.1037 243.1929,-898.1037 243.1929,-898.1037 242.6711,-893.131 238.7175,-898.5734 242.1493,-888.1583 242.1493,-888.1583"/>
<path fill="none" stroke="#000000" d="M494.7237,-1111.7203C500.1861,-1099.6328 505.8669,-1087.4598 511.5,-1076 539.94,-1018.1426 575.724,-953.7952 601.3513,-908.9672"/>
<polygon fill="#000000" stroke="#000000" points="606.3362,-900.2696 605.2679,-911.1833 603.8499,-904.6076 601.3637,-908.9457 601.3637,-908.9457 601.3637,-908.9457 603.8499,-904.6076 597.4594,-906.708 606.3362,-900.2696 606.3362,-900.2696"/>
</g>
<!-- A23 -->
<g id="node24" class="node">
<title>A23</title>
<polygon fill="none" stroke="#000000" points="395.5,-1598 395.5,-1630 470.5,-1630 470.5,-1598 395.5,-1598"/>
<text text-anchor="start" x="415.2175" y="-1611" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Modbus</text>
<polygon fill="none" stroke="#000000" points="395.5,-1446 395.5,-1598 470.5,-1598 470.5,-1446 395.5,-1446"/>
<text text-anchor="start" x="424.6615" y="-1579" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">que</text>
<text text-anchor="start" x="405.49" y="-1555" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">snd_handler</text>
<text text-anchor="start" x="406.605" y="-1543" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rsp_handler</text>
<text text-anchor="start" x="416.6085" y="-1531" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">timeout</text>
<text text-anchor="start" x="406.8895" y="-1519" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">max_retires</text>
<text text-anchor="start" x="414.942" y="-1507" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">last_xxx</text>
<text text-anchor="start" x="426.8915" y="-1495" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">err</text>
<text text-anchor="start" x="413.5535" y="-1483" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">retry_cnt</text>
<text text-anchor="start" x="411.879" y="-1471" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">req_pend</text>
<text text-anchor="start" x="426.3365" y="-1459" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tim</text>
<polygon fill="none" stroke="#000000" points="395.5,-1378 395.5,-1446 470.5,-1446 470.5,-1378 395.5,-1378"/>
<text text-anchor="start" x="406.89" y="-1427" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">build_msg()</text>
<text text-anchor="start" x="410.224" y="-1415" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">recv_req()</text>
<text text-anchor="start" x="407.724" y="-1403" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">recv_resp()</text>
<text text-anchor="start" x="418.0025" y="-1391" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<polygon fill="none" stroke="#000000" points="541.5,-1610 541.5,-1642 616.5,-1642 616.5,-1610 541.5,-1610"/>
<text text-anchor="start" x="561.2175" y="-1623" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Modbus</text>
<polygon fill="none" stroke="#000000" points="541.5,-1458 541.5,-1610 616.5,-1610 616.5,-1458 541.5,-1458"/>
<text text-anchor="start" x="570.6615" y="-1591" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">que</text>
<text text-anchor="start" x="551.49" y="-1567" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">snd_handler</text>
<text text-anchor="start" x="552.605" y="-1555" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rsp_handler</text>
<text text-anchor="start" x="562.6085" y="-1543" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">timeout</text>
<text text-anchor="start" x="552.8895" y="-1531" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">max_retires</text>
<text text-anchor="start" x="560.942" y="-1519" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">last_xxx</text>
<text text-anchor="start" x="572.8915" y="-1507" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">err</text>
<text text-anchor="start" x="559.5535" y="-1495" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">retry_cnt</text>
<text text-anchor="start" x="557.879" y="-1483" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">req_pend</text>
<text text-anchor="start" x="572.3365" y="-1471" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tim</text>
<polygon fill="none" stroke="#000000" points="541.5,-1390 541.5,-1458 616.5,-1458 616.5,-1390 541.5,-1390"/>
<text text-anchor="start" x="552.89" y="-1439" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">build_msg()</text>
<text text-anchor="start" x="556.224" y="-1427" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">recv_req()</text>
<text text-anchor="start" x="553.724" y="-1415" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">recv_resp()</text>
<text text-anchor="start" x="564.0025" y="-1403" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A23&#45;&gt;A21 -->
<g id="edge32" class="edge">
<title>A23&#45;&gt;A21</title>
<path fill="none" stroke="#000000" d="M473.6171,-1381.5836C475.5712,-1376.3055 477.537,-1371.0921 479.5,-1366 485.7253,-1349.8514 492.5573,-1333.0014 499.4927,-1316.4014"/>
<polygon fill="#000000" stroke="#000000" points="470.1153,-1391.1417 469.3301,-1380.2039 471.8353,-1386.4468 473.5554,-1381.752 473.5554,-1381.752 473.5554,-1381.752 471.8353,-1386.4468 477.7808,-1383.3 470.1153,-1391.1417 470.1153,-1391.1417"/>
<text text-anchor="middle" x="500.3258" y="-1333.384" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
<text text-anchor="middle" x="468.4143" y="-1368.2141" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
<path fill="none" stroke="#000000" d="M578.0656,-1379.6092C578.0111,-1362.4944 577.9556,-1345.047 577.9016,-1328.0999"/>
<polygon fill="#000000" stroke="#000000" points="578.0976,-1389.6415 573.5657,-1379.6559 578.0816,-1384.6415 578.0656,-1379.6415 578.0656,-1379.6415 578.0656,-1379.6415 578.0816,-1384.6415 582.5656,-1379.6272 578.0976,-1389.6415 578.0976,-1389.6415"/>
<text text-anchor="middle" x="586.4116" y="-1343.199" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
<text text-anchor="middle" x="569.5875" y="-1368.5423" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A23&#45;&gt;A22 -->
<g id="edge31" class="edge">
<title>A23&#45;&gt;A22</title>
<path fill="none" stroke="#000000" d="M432.5,-1367.2886C432.5,-1337.886 432.5,-1307.5179 432.5,-1280.403"/>
<polygon fill="#000000" stroke="#000000" points="432.5,-1377.6415 428.0001,-1367.6414 432.5,-1372.6415 432.5001,-1367.6415 432.5001,-1367.6415 432.5001,-1367.6415 432.5,-1372.6415 437.0001,-1367.6415 432.5,-1377.6415 432.5,-1377.6415"/>
<text text-anchor="middle" x="440.9524" y="-1295.5292" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
<text text-anchor="middle" x="424.0476" y="-1356.5153" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
<path fill="none" stroke="#000000" d="M537.4368,-1393.825C535.4631,-1388.4654 533.4791,-1383.1707 531.5,-1378 524.9997,-1361.0167 510.3384,-1326.3617 495.687,-1292.2598"/>
<polygon fill="#000000" stroke="#000000" points="540.9749,-1403.5299 533.3219,-1395.6762 539.2623,-1398.8324 537.5497,-1394.1348 537.5497,-1394.1348 537.5497,-1394.1348 539.2623,-1398.8324 541.7775,-1392.5934 540.9749,-1403.5299 540.9749,-1403.5299"/>
<text text-anchor="middle" x="510.6003" y="-1302.5862" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
<text text-anchor="middle" x="526.8253" y="-1386.3953" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A24 -->
<g id="node25" class="node">
<title>A24</title>
<polygon fill="none" stroke="#000000" points=".5,-330 .5,-362 107.5,-362 107.5,-330 .5,-330"/>
<text text-anchor="start" x="24.2695" y="-343" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ModbusConn</text>
<polygon fill="none" stroke="#000000" points=".5,-262 .5,-330 107.5,-330 107.5,-262 .5,-262"/>
<text text-anchor="start" x="44.5515" y="-311" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">host</text>
<text text-anchor="start" x="45.387" y="-299" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">port</text>
<text text-anchor="start" x="43.997" y="-287" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="10.383" y="-275" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">stream:InverterG3P</text>
<polygon fill="none" stroke="#000000" points=".5,-242 .5,-262 107.5,-262 107.5,-242 .5,-242"/>
<polygon fill="none" stroke="#000000" points=".5,-342 .5,-374 107.5,-374 107.5,-342 .5,-342"/>
<text text-anchor="start" x="24.2695" y="-355" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ModbusConn</text>
<polygon fill="none" stroke="#000000" points=".5,-274 .5,-342 107.5,-342 107.5,-274 .5,-274"/>
<text text-anchor="start" x="44.5515" y="-323" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">host</text>
<text text-anchor="start" x="45.387" y="-311" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">port</text>
<text text-anchor="start" x="43.997" y="-299" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="10.383" y="-287" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">stream:InverterG3P</text>
<polygon fill="none" stroke="#000000" points=".5,-254 .5,-274 107.5,-274 107.5,-254 .5,-254"/>
</g>
<!-- A24&#45;&gt;A4 -->
<g id="edge33" class="edge">
<title>A24&#45;&gt;A4</title>
<path fill="none" stroke="#000000" d="M84.8997,-241.788C94.9393,-222.6449 106.1365,-201.4067 116.5,-182 124.6218,-166.7911 133.4111,-150.5028 141.774,-135.0831"/>
<polygon fill="#000000" stroke="#000000" points="146.6405,-126.1193 145.824,-137.0548 144.2548,-130.5135 141.8692,-134.9077 141.8692,-134.9077 141.8692,-134.9077 144.2548,-130.5135 137.9144,-132.7607 146.6405,-126.1193 146.6405,-126.1193"/>
<text text-anchor="middle" x="145.4203" y="-143.0821" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
<text text-anchor="middle" x="85.8379" y="-218.81" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
<path fill="none" stroke="#000000" d="M81.542,-253.7032C91.4418,-234.161 103.1944,-212.7106 115.5,-194 125.3404,-179.0377 136.6783,-163.7591 148.1066,-149.3021"/>
<polygon fill="#000000" stroke="#000000" points="154.456,-141.3622 151.725,-151.9825 151.3333,-145.2671 148.2105,-149.1721 148.2105,-149.1721 148.2105,-149.1721 151.3333,-145.2671 144.6961,-146.3616 154.456,-141.3622 154.456,-141.3622"/>
<text text-anchor="middle" x="149.7367" y="-157.7974" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
<text text-anchor="middle" x="82.2674" y="-230.7164" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 50 KiB

View File

@@ -5,9 +5,9 @@
[note: You can stick notes on diagrams too!{bg:cornsilk}]
[Mqtt;<<Singleton>>|<static>ha_restarts;<static>__client;<static>__cb_MqttIsUp|<async>publish();<async>close()]
[Inverter|cls.db_stat;cls.entity_prfx;cls.discovery_prfx;cls.proxy_node_id;cls.proxy_unique_id;cls.mqtt:Mqtt|]
[Inverter]^[InverterG3|__ha_restarts|async_create_remote();async_publ_mqtt();;close()]
[Inverter]^[InverterG3P|__ha_restarts|async_create_remote(;)async_publ_mqtt();close()]
[Inverter|cls.db_stat;cls.entity_prfx;cls.discovery_prfx;cls.proxy_node_id;cls.proxy_unique_id;cls.mqtt:Mqtt;;__ha_restarts|async_create_remote(inv_prot, conn_class)async_publ_mqtt()]
[Inverter]^[InverterG3|addr;remote:StreamPtr;local:StreamPtr|async_create_remote();;close()]
[Inverter]^[InverterG3P|addr;remote:StreamPtr;local:StreamPtr|async_create_remote();;close()]
[Mqtt;<<Singleton>>]<-++[Inverter]
[IterRegistry||__iter__]^[Message|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]
@@ -24,23 +24,23 @@
[ConnectionG3|remote.stream:ConnectionG3|healthy()]
[ConnectionG3Client|remote.stream:ConnectionG3|close()]
[ConnectionG3Server|remote.stream:ConnectionG3|;close()]
[ConnectionG3Client|_ifc:AsyncStreamClient;conn_no;addr|close()]
[ConnectionG3Server|_ifc:AsyncStreamServer;conn_no;addr|;close()]
[ConnectionG3]^[ConnectionG3Client]
[ConnectionG3]^[ConnectionG3Server]
[ConnectionG3Client]<-[ConnectionG3Server]
[ConnectionG3Client]-[InverterG3]
[ConnectionG3Client]++-1>[AsyncStreamClient]
[ConnectionG3Server]^[InverterG3]
[ConnectionG3Server]-[InverterG3]
[ConnectionG3Server]++-1>[AsyncStreamServer]
[ConnectionG3P|remote.stream:ConnectionG3P|healthy();close()]
[ConnectionG3PClient|remote.stream:ConnectionG3P|close()]
[ConnectionG3PServer|remote.stream:ConnectionG3P|;close()]
[ConnectionG3PClient|_ifc:AsyncStreamClient;conn_no;addr|close()]
[ConnectionG3PServer|_ifc:AsyncStreamServer;conn_no;addr|;close()]
[ConnectionG3P]^[ConnectionG3PClient]
[ConnectionG3P]^[ConnectionG3PServer]
[ConnectionG3PClient]<-[ConnectionG3PServer]
[ConnectionG3PClient]-[InverterG3P]
[ConnectionG3PClient]++-1>[AsyncStreamClient]
[ConnectionG3PServer]^[InverterG3P]
[ConnectionG3PServer]-[InverterG3P]
[ConnectionG3PServer]++-1>[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]

View File

@@ -3,23 +3,19 @@ from asyncio import StreamReader, StreamWriter
if __name__ == "app.src.gen3.connection_g3":
from app.src.async_stream import AsyncStreamServer
from app.src.async_stream import AsyncStreamClient, StreamPtr
from app.src.async_stream import AsyncStreamClient
from app.src.inverter import Inverter
from app.src.gen3.talent import Talent
else: # pragma: no cover
from async_stream import AsyncStreamServer
from async_stream import AsyncStreamClient, StreamPtr
from async_stream import AsyncStreamClient
from inverter import Inverter
from gen3.talent import Talent
logger = logging.getLogger('conn')
class ConnectionG3(Talent):
async def async_create_remote(self) -> None:
pass # virtual interface # pragma: no cover
async def async_publ_mqtt(self) -> None:
pass # virtual interface # pragma: no cover
def healthy(self) -> bool:
logger.debug('ConnectionG3 healthy()')
return self._ifc.healthy()
@@ -32,16 +28,15 @@ class ConnectionG3(Talent):
class ConnectionG3Server(ConnectionG3):
def __init__(self, reader: StreamReader, writer: StreamWriter,
addr, rstream: 'ConnectionG3Client',
id_str=b'') -> None:
def __init__(self, inverter: "Inverter",
reader: StreamReader, writer: StreamWriter,
addr, id_str=b'') -> None:
server_side = True
self.remote = StreamPtr(rstream)
self._ifc = AsyncStreamServer(reader, writer,
self.async_publ_mqtt,
self.async_create_remote,
self.remote)
inverter.async_publ_mqtt,
inverter.async_create_remote,
inverter.remote)
self.conn_no = self._ifc.get_conn_no()
self.addr = addr
Talent.__init__(self, server_side, self._ifc, id_str)
@@ -49,13 +44,12 @@ class ConnectionG3Server(ConnectionG3):
class ConnectionG3Client(ConnectionG3):
def __init__(self, reader: StreamReader, writer: StreamWriter,
addr, rstream: 'ConnectionG3Server',
id_str=b'') -> None:
def __init__(self, inverter: "Inverter",
reader: StreamReader, writer: StreamWriter,
addr, id_str=b'') -> None:
server_side = False
self.remote = StreamPtr(rstream)
self._ifc = AsyncStreamClient(reader, writer,
self.remote)
inverter.remote)
self.conn_no = self._ifc.get_conn_no()
self.addr = addr
Talent.__init__(self, server_side, self._ifc, id_str)

View File

@@ -3,10 +3,12 @@ from asyncio import StreamReader, StreamWriter
if __name__ == "app.src.gen3.inverter_g3":
from app.src.inverter import Inverter
from app.src.async_stream import StreamPtr
from app.src.gen3.connection_g3 import ConnectionG3Server
from app.src.gen3.connection_g3 import ConnectionG3Client
else: # pragma: no cover
from inverter import Inverter
from async_stream import StreamPtr
from gen3.connection_g3 import ConnectionG3Server
from gen3.connection_g3 import ConnectionG3Client
@@ -14,40 +16,14 @@ else: # pragma: no cover
logger_mqtt = logging.getLogger('mqtt')
class InverterG3(Inverter, ConnectionG3Server):
'''class Inverter is a derivation of an Async_Stream
The class has some class method for managing common resources like a
connection to the MQTT broker or proxy error counter which are common
for all inverter connection
Instances of the class are connections to an inverter and can have an
optional link to an remote connection to the TSUN cloud. A remote
connection dies with the inverter connection.
class methods:
class_init(): initialize the common resources of the proxy (MQTT
broker, Proxy DB, etc). Must be called before the
first inverter instance can be created
class_close(): release the common resources of the proxy. Should not
be called before any instances of the class are
destroyed
methods:
server_loop(addr): Async loop method for receiving messages from the
inverter (server-side)
client_loop(addr): Async loop method for receiving messages from the
TSUN cloud (client-side)
async_create_remote(): Establish a client connection to the TSUN cloud
async_publ_mqtt(): Publish data to MQTT broker
close(): Release method which must be called before a instance can be
destroyed
'''
class InverterG3(Inverter):
def __init__(self, reader: StreamReader, writer: StreamWriter, addr):
Inverter.__init__(self)
ConnectionG3Server.__init__(self, reader, writer, addr, None)
super().__init__()
self.addr = addr
self.remote = StreamPtr(None)
self.local = StreamPtr(
ConnectionG3Server(self, reader, writer, addr)
)
async def async_create_remote(self) -> None:
await Inverter.async_create_remote(
@@ -55,5 +31,5 @@ class InverterG3(Inverter, ConnectionG3Server):
def close(self) -> None:
logging.debug(f'InverterG3.close() {self.addr}')
ConnectionG3Server.close(self)
self.local.stream.close()
# logging.info(f'Inverter refs: {gc.get_referrers(self)}')

View File

@@ -3,23 +3,19 @@ from asyncio import StreamReader, StreamWriter
if __name__ == "app.src.gen3plus.connection_g3p":
from app.src.async_stream import AsyncStreamServer
from app.src.async_stream import AsyncStreamClient, StreamPtr
from app.src.async_stream import AsyncStreamClient
from app.src.inverter import Inverter
from app.src.gen3plus.solarman_v5 import SolarmanV5
else: # pragma: no cover
from async_stream import AsyncStreamServer
from async_stream import AsyncStreamClient, StreamPtr
from async_stream import AsyncStreamClient
from inverter import Inverter
from gen3plus.solarman_v5 import SolarmanV5
logger = logging.getLogger('conn')
class ConnectionG3P(SolarmanV5):
async def async_create_remote(self) -> None:
pass # virtual interface # pragma: no cover
async def async_publ_mqtt(self) -> None:
pass # virtual interface # pragma: no cover
def healthy(self) -> bool:
logger.debug('ConnectionG3P healthy()')
return self._ifc.healthy()
@@ -32,16 +28,15 @@ class ConnectionG3P(SolarmanV5):
class ConnectionG3PServer(ConnectionG3P):
def __init__(self, reader: StreamReader, writer: StreamWriter,
addr, rstream: 'ConnectionG3PClient',
client_mode: bool) -> None:
def __init__(self, inverter: "Inverter",
reader: StreamReader, writer: StreamWriter,
addr, client_mode: bool) -> None:
server_side = True
self.remote = StreamPtr(rstream)
self._ifc = AsyncStreamServer(reader, writer,
self.async_publ_mqtt,
self.async_create_remote,
self.remote)
inverter.async_publ_mqtt,
inverter.async_create_remote,
inverter.remote)
self.conn_no = self._ifc.get_conn_no()
self.addr = addr
SolarmanV5.__init__(self, server_side, client_mode, self._ifc)
@@ -49,13 +44,13 @@ class ConnectionG3PServer(ConnectionG3P):
class ConnectionG3PClient(ConnectionG3P):
def __init__(self, reader: StreamReader, writer: StreamWriter,
addr, rstream: 'ConnectionG3PServer') -> None:
def __init__(self, inverter: "Inverter",
reader: StreamReader, writer: StreamWriter,
addr) -> None:
server_side = False
client_mode = False
self.remote = StreamPtr(rstream)
self._ifc = AsyncStreamClient(reader, writer, self.remote)
self._ifc = AsyncStreamClient(reader, writer, inverter.remote)
self.conn_no = self._ifc.get_conn_no()
self.addr = addr
SolarmanV5.__init__(self, server_side, client_mode, self._ifc)

View File

@@ -3,10 +3,12 @@ from asyncio import StreamReader, StreamWriter
if __name__ == "app.src.gen3plus.inverter_g3p":
from app.src.inverter import Inverter
from app.src.async_stream import StreamPtr
from app.src.gen3plus.connection_g3p import ConnectionG3PServer
from app.src.gen3plus.connection_g3p import ConnectionG3PClient
else: # pragma: no cover
from inverter import Inverter
from async_stream import StreamPtr
from gen3plus.connection_g3p import ConnectionG3PServer
from gen3plus.connection_g3p import ConnectionG3PClient
@@ -14,42 +16,15 @@ else: # pragma: no cover
logger_mqtt = logging.getLogger('mqtt')
class InverterG3P(Inverter, ConnectionG3PServer):
'''class Inverter is a derivation of an Async_Stream
The class has some class method for managing common resources like a
connection to the MQTT broker or proxy error counter which are common
for all inverter connection
Instances of the class are connections to an inverter and can have an
optional link to an remote connection to the TSUN cloud. A remote
connection dies with the inverter connection.
class methods:
class_init(): initialize the common resources of the proxy (MQTT
broker, Proxy DB, etc). Must be called before the
first inverter instance can be created
class_close(): release the common resources of the proxy. Should not
be called before any instances of the class are
destroyed
methods:
server_loop(addr): Async loop method for receiving messages from the
inverter (server-side)
client_loop(addr): Async loop method for receiving messages from the
TSUN cloud (client-side)
async_create_remote(): Establish a client connection to the TSUN cloud
async_publ_mqtt(): Publish data to MQTT broker
close(): Release method which must be called before a instance can be
destroyed
'''
class InverterG3P(Inverter):
def __init__(self, reader: StreamReader, writer: StreamWriter, addr,
client_mode: bool = False):
Inverter.__init__(self)
ConnectionG3PServer.__init__(
self, reader, writer, addr, None, client_mode=client_mode)
super().__init__()
self.addr = addr
self.remote = StreamPtr(None)
self.local = StreamPtr(
ConnectionG3PServer(self, reader, writer, addr, client_mode)
)
async def async_create_remote(self) -> None:
await Inverter.async_create_remote(
@@ -57,5 +32,5 @@ class InverterG3P(Inverter, ConnectionG3PServer):
def close(self) -> None:
logging.debug(f'InverterG3P.close() {self.addr}')
ConnectionG3PServer.close(self)
self.local.stream.close()
# logger.debug (f'Inverter refs: {gc.get_referrers(self)}')

View File

@@ -17,6 +17,28 @@ logger_mqtt = logging.getLogger('mqtt')
class Inverter():
'''class Inverter is a baseclass
The class has some class method for managing common resources like a
connection to the MQTT broker or proxy error counter which are common
for all inverter connection
Instances of the class are connections to an inverter and can have an
optional link to an remote connection to the TSUN cloud. A remote
connection dies with the inverter connection.
class methods:
class_init(): initialize the common resources of the proxy (MQTT
broker, Proxy DB, etc). Must be called before the
first inverter instance can be created
class_close(): release the common resources of the proxy. Should not
be called before any instances of the class are
destroyed
methods:
async_create_remote(): Establish a client connection to the TSUN cloud
async_publ_mqtt(): Publish data to MQTT broker
'''
@classmethod
def class_init(cls) -> None:
logging.debug('Inverter.class_init')
@@ -94,17 +116,18 @@ class Inverter():
host = tsun['host']
port = tsun['port']
addr = (host, port)
stream = self.local.stream
try:
logging.info(f'[{self.node_id}] Connect to {addr}')
logging.info(f'[{stream.node_id}] Connect to {addr}')
connect = asyncio.open_connection(host, port)
reader, writer = await connect
if hasattr(self, 'id_str'):
if hasattr(stream, 'id_str'):
self.remote.stream = conn_class(
reader, writer, addr, self, self.id_str)
self, reader, writer, addr, stream.id_str)
else:
self.remote.stream = conn_class(
reader, writer, addr, self)
self, reader, writer, addr)
logging.info(f'[{self.remote.stream.node_id}:'
f'{self.remote.stream.conn_no}] '
@@ -114,56 +137,57 @@ class Inverter():
except (ConnectionRefusedError, TimeoutError) as error:
logging.info(f'{error}')
except Exception:
self.inc_counter('SW_Exception')
Infos.inc_counter('SW_Exception')
logging.error(
f"Inverter: Exception for {addr}:\n"
f"{traceback.format_exc()}")
async def async_publ_mqtt(self) -> None:
'''publish data to MQTT broker'''
if not self.unique_id:
stream = self.local.stream
if not stream.unique_id:
return
# check if new inverter or collector infos are available or when the
# home assistant has changed the status back to online
try:
if (('inverter' in self.new_data and self.new_data['inverter'])
or ('collector' in self.new_data and
self.new_data['collector'])
if (('inverter' in stream.new_data and stream.new_data['inverter'])
or ('collector' in stream.new_data and
stream.new_data['collector'])
or self.mqtt.ha_restarts != self.__ha_restarts):
await self._register_proxy_stat_home_assistant()
await self.__register_home_assistant()
await self.__register_home_assistant(stream)
self.__ha_restarts = self.mqtt.ha_restarts
for key in self.new_data:
await self.__async_publ_mqtt_packet(key)
for key in stream.new_data:
await self.__async_publ_mqtt_packet(stream, key)
for key in Infos.new_stat_data:
await Inverter._async_publ_mqtt_proxy_stat(key)
except MqttCodeError as error:
logging.error(f'Mqtt except: {error}')
except Exception:
self.inc_counter('SW_Exception')
Infos.inc_counter('SW_Exception')
logging.error(
f"Inverter: Exception:\n"
f"{traceback.format_exc()}")
async def __async_publ_mqtt_packet(self, key):
db = self.db.db
if key in db and self.new_data[key]:
async def __async_publ_mqtt_packet(self, stream, key):
db = stream.db.db
if key in db and stream.new_data[key]:
data_json = json.dumps(db[key])
node_id = self.node_id
node_id = stream.node_id
logger_mqtt.debug(f'{key}: {data_json}')
await self.mqtt.publish(f'{self.entity_prfx}{node_id}{key}', data_json) # noqa: E501
self.new_data[key] = False
stream.new_data[key] = False
async def __register_home_assistant(self) -> None:
async def __register_home_assistant(self, stream) -> None:
'''register all our topics at home assistant'''
for data_json, component, node_id, id in self.db.ha_confs(
self.entity_prfx, self.node_id, self.unique_id,
self.sug_area):
for data_json, component, node_id, id in stream.db.ha_confs(
self.entity_prfx, stream.node_id, stream.unique_id,
stream.sug_area):
logger_mqtt.debug(f"MQTT Register: cmp:'{component}'"
f" node_id:'{node_id}' {data_json}")
await self.mqtt.publish(f"{self.discovery_prfx}{component}"
f"/{node_id}{id}/config", data_json)
self.db.reg_clr_at_midnight(f'{self.entity_prfx}{self.node_id}')
stream.db.reg_clr_at_midnight(f'{self.entity_prfx}{stream.node_id}')

View File

@@ -19,24 +19,25 @@ class ModbusConn():
self.host = host
self.port = port
self.addr = (host, port)
self.stream = None
self.inverter = None
async def __aenter__(self) -> 'InverterG3P':
'''Establish a client connection to the TSUN cloud'''
connection = asyncio.open_connection(self.host, self.port)
reader, writer = await connection
self.stream = InverterG3P(reader, writer, self.addr,
client_mode=True)
logging.info(f'[{self.stream.node_id}:{self.stream.conn_no}] '
self.inverter = InverterG3P(reader, writer, self.addr,
client_mode=True)
stream = self.inverter.local.stream
logging.info(f'[{stream.node_id}:{stream.conn_no}] '
f'Connected to {self.addr}')
Infos.inc_counter('Inverter_Cnt')
await self.stream._ifc.publish_outstanding_mqtt()
return self.stream
await self.inverter.local._ifc.publish_outstanding_mqtt()
return self.inverter
async def __aexit__(self, exc_type, exc, tb):
Infos.dec_counter('Inverter_Cnt')
await self.stream._ifc.publish_outstanding_mqtt()
self.stream.close()
await self.inverter.local._ifc.publish_outstanding_mqtt()
self.inverter.close()
class ModbusTcp():
@@ -61,7 +62,8 @@ class ModbusTcp():
'''Loop for receiving messages from the TSUN cloud (client-side)'''
while True:
try:
async with ModbusConn(host, port) as stream:
async with ModbusConn(host, port) as inverter:
stream = inverter.local.stream
await stream.send_start_cmd(snr, host)
await stream._ifc.loop()
logger.info(f'[{stream.node_id}:{stream.conn_no}] '

View File

@@ -4,10 +4,24 @@ import asyncio
from itertools import count
from mock import patch
from app.src.async_stream import StreamPtr
from app.src.async_stream import AsyncStream, AsyncIfcImpl
from app.src.gen3.connection_g3 import ConnectionG3Server
from app.src.gen3.talent import Talent
class FakeInverter():
async def async_publ_mqtt(self) -> None:
pass # dummy funcion
async def async_create_remote(self, inv_prot: str, conn_class) -> None:
pass # dummy function
def __init__ (self):
self.remote = StreamPtr(None)
self.local = StreamPtr(None)
@pytest.fixture
def patch_async_init():
with patch.object(AsyncStream, '__init__') as conn:
@@ -71,8 +85,8 @@ def test_method_calls(patch_talent_init, patch_healthy, patch_async_close, patch
writer = FakeWriter()
id_str = "id_string"
addr = ('proxy.local', 10000)
conn = ConnectionG3Server(reader, writer, addr,
rstream= None, id_str=id_str)
conn = ConnectionG3Server(FakeInverter(), reader, writer, addr,
id_str=id_str)
assert 5 == conn._ifc.get_conn_no()
spy2.assert_called_once_with(conn, True, conn._ifc, id_str)
conn.healthy()

View File

@@ -5,10 +5,23 @@ import asyncio
from itertools import count
from mock import patch
from app.src.singleton import Singleton
from app.src.async_stream import AsyncStream, AsyncIfcImpl
from app.src.async_stream import AsyncStream, AsyncIfcImpl, StreamPtr
from app.src.gen3plus.connection_g3p import ConnectionG3PServer
from app.src.gen3plus.solarman_v5 import SolarmanV5
class FakeInverter():
async def async_publ_mqtt(self) -> None:
pass # dummy funcion
async def async_create_remote(self, inv_prot: str, conn_class) -> None:
pass # dummy function
def __init__ (self):
self.remote = StreamPtr(None)
self.local = StreamPtr(None)
@pytest.fixture
def patch_async_init():
with patch.object(AsyncStream, '__init__', return_value= None) as conn:
@@ -76,8 +89,8 @@ def test_method_calls(patch_solarman_init, patch_healthy, patch_async_close, pat
reader = FakeReader()
writer = FakeWriter()
addr = ('proxy.local', 10000)
conn = ConnectionG3PServer(reader, writer, addr,
rstream= None, client_mode=False)
conn = ConnectionG3PServer(FakeInverter(), reader, writer, addr,
client_mode=False)
assert 5 == conn._ifc.get_conn_no()
spy2.assert_called_once_with(conn, True, False, conn._ifc)
conn.healthy()

View File

@@ -104,18 +104,14 @@ def patch_open_connection():
yield conn
def test_method_calls(patch_conn_init, patch_conn_close):
spy1 = patch_conn_init
def test_method_calls(patch_conn_close):
spy2 = patch_conn_close
reader = FakeReader()
writer = FakeWriter()
addr = ('proxy.local', 10000)
inverter = InverterG3(reader, writer, addr)
inverter.l_addr = ''
inverter.r_addr = ''
spy1.assert_called_once()
spy1.assert_called_once_with(inverter, reader, writer, addr, None)
assert inverter.local.stream
assert inverter.local.ifc
inverter.close()
spy2.assert_called_once()
@@ -171,18 +167,19 @@ async def test_mqtt_publish(config_conn, patch_open_connection, patch_conn_close
Inverter.class_init()
inverter = InverterG3(FakeReader(), FakeWriter(), ('proxy.local', 10000))
stream = inverter.local.stream
await inverter.async_publ_mqtt() # check call with invalid unique_id
inverter._Talent__set_serial_no(serial_no= "123344")
stream._Talent__set_serial_no(serial_no= "123344")
inverter.new_data['inverter'] = True
inverter.db.db['inverter'] = {}
stream.new_data['inverter'] = True
stream.db.db['inverter'] = {}
await inverter.async_publ_mqtt()
assert inverter.new_data['inverter'] == False
assert stream.new_data['inverter'] == False
inverter.new_data['env'] = True
inverter.db.db['env'] = {}
stream.new_data['env'] = True
stream.db.db['env'] = {}
await inverter.async_publ_mqtt()
assert inverter.new_data['env'] == False
assert stream.new_data['env'] == False
Infos.new_stat_data['proxy'] = True
await inverter.async_publ_mqtt()
@@ -203,12 +200,12 @@ async def test_mqtt_err(config_conn, patch_open_connection, patch_mqtt_err, patc
Inverter.class_init()
inverter = InverterG3(FakeReader(), FakeWriter(), ('proxy.local', 10000))
inverter._Talent__set_serial_no(serial_no= "123344")
inverter.new_data['inverter'] = True
inverter.db.db['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 inverter.new_data['inverter'] == True
assert stream.new_data['inverter'] == True
inverter.close()
spy1.assert_called_once()
@@ -225,12 +222,13 @@ async def test_mqtt_except(config_conn, patch_open_connection, patch_mqtt_except
Inverter.class_init()
inverter = InverterG3(FakeReader(), FakeWriter(), ('proxy.local', 10000))
inverter._Talent__set_serial_no(serial_no= "123344")
stream = inverter.local.stream
stream._Talent__set_serial_no(serial_no= "123344")
inverter.new_data['inverter'] = True
inverter.db.db['inverter'] = {}
stream.new_data['inverter'] = True
stream.db.db['inverter'] = {}
await inverter.async_publ_mqtt()
assert inverter.new_data['inverter'] == True
assert stream.new_data['inverter'] == True
inverter.close()
spy1.assert_called_once()

View File

@@ -105,18 +105,14 @@ def patch_open_connection():
yield conn
def test_method_calls(patch_conn_init, patch_conn_close):
spy1 = patch_conn_init
def test_method_calls(patch_conn_close):
spy2 = patch_conn_close
reader = FakeReader()
writer = FakeWriter()
addr = ('proxy.local', 10000)
inverter = InverterG3P(reader, writer, addr, client_mode=False)
inverter.l_addr = ''
inverter.r_addr = ''
spy1.assert_called_once()
spy1.assert_called_once_with(inverter, reader, writer, addr, None, client_mode=False)
assert inverter.local.stream
assert inverter.local.ifc
inverter.close()
spy2.assert_called_once()
@@ -172,18 +168,19 @@ async def test_mqtt_publish(config_conn, patch_open_connection, patch_conn_close
Inverter.class_init()
inverter = InverterG3P(FakeReader(), FakeWriter(), ('proxy.local', 10000), client_mode=False)
stream = inverter.local.stream
await inverter.async_publ_mqtt() # check call with invalid unique_id
inverter._SolarmanV5__set_serial_no(snr= 123344)
stream._SolarmanV5__set_serial_no(snr= 123344)
inverter.new_data['inverter'] = True
inverter.db.db['inverter'] = {}
stream.new_data['inverter'] = True
stream.db.db['inverter'] = {}
await inverter.async_publ_mqtt()
assert inverter.new_data['inverter'] == False
assert stream.new_data['inverter'] == False
inverter.new_data['env'] = True
inverter.db.db['env'] = {}
stream.new_data['env'] = True
stream.db.db['env'] = {}
await inverter.async_publ_mqtt()
assert inverter.new_data['env'] == False
assert stream.new_data['env'] == False
Infos.new_stat_data['proxy'] = True
await inverter.async_publ_mqtt()
@@ -204,12 +201,12 @@ async def test_mqtt_err(config_conn, patch_open_connection, patch_mqtt_err, patc
Inverter.class_init()
inverter = InverterG3P(FakeReader(), FakeWriter(), ('proxy.local', 10000), client_mode=False)
inverter._SolarmanV5__set_serial_no(snr= 123344)
inverter.new_data['inverter'] = True
inverter.db.db['inverter'] = {}
stream = inverter.local.stream
stream._SolarmanV5__set_serial_no(snr= 123344)
stream.new_data['inverter'] = True
stream.db.db['inverter'] = {}
await inverter.async_publ_mqtt()
assert inverter.new_data['inverter'] == True
assert stream.new_data['inverter'] == True
inverter.close()
spy1.assert_called_once()
@@ -226,12 +223,13 @@ async def test_mqtt_except(config_conn, patch_open_connection, patch_mqtt_except
Inverter.class_init()
inverter = InverterG3P(FakeReader(), FakeWriter(), ('proxy.local', 10000), client_mode=False)
inverter._SolarmanV5__set_serial_no(snr= 123344)
stream = inverter.local.stream
stream._SolarmanV5__set_serial_no(snr= 123344)
inverter.new_data['inverter'] = True
inverter.db.db['inverter'] = {}
stream.new_data['inverter'] = True
stream.db.db['inverter'] = {}
await inverter.async_publ_mqtt()
assert inverter.new_data['inverter'] == True
assert stream.new_data['inverter'] == True
inverter.close()
spy1.assert_called_once()

View File

@@ -150,7 +150,8 @@ async def test_modbus_conn(patch_open):
_ = patch_open
assert Infos.stat['proxy']['Inverter_Cnt'] == 0
async with ModbusConn('test.local', 1234) as stream:
async with ModbusConn('test.local', 1234) as inverter:
stream = inverter.local.stream
assert stream.node_id == 'G3P'
assert stream.addr == ('test.local', 1234)
assert type(stream._ifc._reader) is FakeReader