split AsyncStream in two classes

This commit is contained in:
Stefan Allius
2024-09-26 23:04:11 +02:00
parent b6761e7517
commit 73526b7dc6
10 changed files with 620 additions and 505 deletions

View File

@@ -4,455 +4,520 @@
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: G Pages: 1 -->
<svg width="927pt" height="1386pt"
viewBox="0.00 0.00 927.00 1386.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 1382)">
<svg width="755pt" height="1784pt"
viewBox="0.00 0.00 754.50 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)">
<title>G</title>
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-1382 923,-1382 923,4 -4,4"/>
<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-1780 750.5,-1780 750.5,4 -4,4"/>
<!-- A0 -->
<g id="node1" class="node">
<title>A0</title>
<polygon fill="#fff8dc" stroke="#000000" points="565.6964,-1354 457.3036,-1354 457.3036,-1318 571.6964,-1318 571.6964,-1348 565.6964,-1354"/>
<polyline fill="none" stroke="#000000" points="565.6964,-1354 565.6964,-1348 "/>
<polyline fill="none" stroke="#000000" points="571.6964,-1348 565.6964,-1348 "/>
<text text-anchor="middle" x="514.5" y="-1339" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">You can stick notes</text>
<text text-anchor="middle" x="514.5" y="-1327" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">on diagrams too!</text>
<polygon fill="#fff8dc" stroke="#000000" points="352.6964,-1752 244.3036,-1752 244.3036,-1716 358.6964,-1716 358.6964,-1746 352.6964,-1752"/>
<polyline fill="none" stroke="#000000" points="352.6964,-1752 352.6964,-1746 "/>
<polyline fill="none" stroke="#000000" points="358.6964,-1746 352.6964,-1746 "/>
<text text-anchor="middle" x="301.5" y="-1737" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">You can stick notes</text>
<text text-anchor="middle" x="301.5" y="-1725" 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="180.5,-820 180.5,-864 302.5,-864 302.5,-820 180.5,-820"/>
<text text-anchor="start" x="231.777" y="-845" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Mqtt</text>
<text text-anchor="start" x="208.9815" y="-833" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;&lt;Singleton&gt;&gt;</text>
<polygon fill="none" stroke="#000000" points="180.5,-764 180.5,-820 302.5,-820 302.5,-764 180.5,-764"/>
<text text-anchor="start" x="198.9875" y="-801" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;static&gt;ha_restarts</text>
<text text-anchor="start" x="206.7665" y="-789" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;static&gt;__client</text>
<text text-anchor="start" x="190.3735" y="-777" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;static&gt;__cb_MqttIsUp</text>
<polygon fill="none" stroke="#000000" points="180.5,-720 180.5,-764 302.5,-764 302.5,-720 180.5,-720"/>
<text text-anchor="start" x="203.436" y="-745" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;publish()</text>
<text text-anchor="start" x="207.6045" y="-733" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;close()</text>
<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>
</g>
<!-- A2 -->
<g id="node3" class="node">
<title>A2</title>
<polygon fill="none" stroke="#000000" points="187.5,-482 187.5,-514 295.5,-514 295.5,-482 187.5,-482"/>
<text text-anchor="start" x="224.5535" y="-495" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Inverter</text>
<polygon fill="none" stroke="#000000" points="187.5,-390 187.5,-482 295.5,-482 295.5,-390 187.5,-390"/>
<text text-anchor="start" x="217.604" y="-463" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.db_stat</text>
<text text-anchor="start" x="210.9405" y="-451" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.entity_prfx</text>
<text text-anchor="start" x="201.7755" y="-439" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.discovery_prfx</text>
<text text-anchor="start" x="201.2115" y="-427" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.proxy_node_id</text>
<text text-anchor="start" x="197.3225" y="-415" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.proxy_unique_id</text>
<text text-anchor="start" x="213.1655" y="-403" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">cls.mqtt:Mqtt</text>
<polygon fill="none" stroke="#000000" points="187.5,-370 187.5,-390 295.5,-390 295.5,-370 187.5,-370"/>
<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"/>
</g>
<!-- A1&#45;&gt;A2 -->
<g id="edge3" class="edge">
<title>A1&#45;&gt;A2</title>
<path fill="none" stroke="#000000" d="M241.5,-709.8039C241.5,-654.5754 241.5,-581.9953 241.5,-526.3277"/>
<polygon fill="#000000" stroke="#000000" points="241.5,-719.9042 237.0001,-709.9041 241.5,-714.9042 241.5001,-709.9042 241.5001,-709.9042 241.5001,-709.9042 241.5,-714.9042 246.0001,-709.9042 241.5,-719.9042 241.5,-719.9042"/>
<polygon fill="#000000" stroke="#000000" points="241.5001,-526.0023 237.5,-520.0023 241.5,-514.0023 245.5,-520.0023 241.5001,-526.0023"/>
<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"/>
</g>
<!-- A3 -->
<g id="node4" class="node">
<title>A3</title>
<polygon fill="none" stroke="#000000" points="142.5,-186 142.5,-218 264.5,-218 264.5,-186 142.5,-186"/>
<text text-anchor="start" x="179.8845" y="-199" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InverterG3</text>
<polygon fill="none" stroke="#000000" points="142.5,-154 142.5,-186 264.5,-186 264.5,-154 142.5,-154"/>
<text text-anchor="start" x="172.9355" y="-167" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__ha_restarts</text>
<polygon fill="none" stroke="#000000" points="142.5,-86 142.5,-154 264.5,-154 264.5,-86 142.5,-86"/>
<text text-anchor="start" x="152.1035" y="-135" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote()</text>
<text text-anchor="start" x="162.382" y="-123" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_publ_mqtt()</text>
<text text-anchor="start" x="188.5025" y="-99" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<polygon fill="none" stroke="#000000" points="267.5,-100 267.5,-132 389.5,-132 389.5,-100 267.5,-100"/>
<text text-anchor="start" x="304.8845" y="-113" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InverterG3</text>
<polygon fill="none" stroke="#000000" points="267.5,-68 267.5,-100 389.5,-100 389.5,-68 267.5,-68"/>
<text text-anchor="start" x="297.9355" y="-81" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__ha_restarts</text>
<polygon fill="none" stroke="#000000" points="267.5,0 267.5,-68 389.5,-68 389.5,0 267.5,0"/>
<text text-anchor="start" x="277.1035" y="-49" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote()</text>
<text text-anchor="start" x="287.382" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_publ_mqtt()</text>
<text text-anchor="start" x="313.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="M230.7486,-359.9499C224.8735,-315.1138 217.6928,-260.3131 212.1779,-218.2258"/>
<polygon fill="none" stroke="#000000" points="227.2883,-360.4815 232.0579,-369.942 234.2289,-359.572 227.2883,-360.4815"/>
<path fill="none" stroke="#000000" d="M219.9257,-220.8317C227.1087,-207.6556 234.7733,-194.3049 242.5,-182 252.8987,-165.4397 264.9445,-148.202 276.6683,-132.2371"/>
<polygon fill="none" stroke="#000000" points="216.6962,-219.4468 215.0349,-229.9106 222.8589,-222.7666 216.6962,-219.4468"/>
</g>
<!-- A4 -->
<g id="node5" class="node">
<title>A4</title>
<polygon fill="none" stroke="#000000" points="528.5,-180 528.5,-212 647.5,-212 647.5,-180 528.5,-180"/>
<text text-anchor="start" x="561.05" y="-193" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InverterG3P</text>
<polygon fill="none" stroke="#000000" points="528.5,-148 528.5,-180 647.5,-180 647.5,-148 528.5,-148"/>
<text text-anchor="start" x="557.4355" y="-161" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__ha_restarts</text>
<polygon fill="none" stroke="#000000" points="528.5,-92 528.5,-148 647.5,-148 647.5,-92 528.5,-92"/>
<text text-anchor="start" x="538.268" y="-129" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote(</text>
<text text-anchor="start" x="545.2175" y="-117" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">)async_publ_mqtt()</text>
<text text-anchor="start" x="573.0025" y="-105" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<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>
</g>
<!-- A2&#45;&gt;A4 -->
<g id="edge2" class="edge">
<title>A2&#45;&gt;A4</title>
<path fill="none" stroke="#000000" d="M253.8698,-359.8546C262.7907,-327.0676 278.1312,-291.5818 304.5,-268 375.3712,-204.6196 428.113,-261.8022 512.5,-218 517.7341,-215.2832 522.9008,-212.1238 527.9257,-208.6874"/>
<polygon fill="none" stroke="#000000" points="250.3809,-359.3724 251.3023,-369.9271 257.164,-361.1015 250.3809,-359.3724"/>
<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"/>
</g>
<!-- A5 -->
<g id="node6" class="node">
<title>A5</title>
<polygon fill="none" stroke="#000000" points="590.5,-1346 590.5,-1378 661.5,-1378 661.5,-1346 590.5,-1346"/>
<text text-anchor="start" x="600.445" y="-1359" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">IterRegistry</text>
<polygon fill="none" stroke="#000000" points="590.5,-1326 590.5,-1346 661.5,-1346 661.5,-1326 590.5,-1326"/>
<polygon fill="none" stroke="#000000" points="590.5,-1294 590.5,-1326 661.5,-1326 661.5,-1294 590.5,-1294"/>
<text text-anchor="start" x="607.939" y="-1307" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__iter__</text>
<polygon fill="none" stroke="#000000" points="377.5,-1744 377.5,-1776 448.5,-1776 448.5,-1744 377.5,-1744"/>
<text text-anchor="start" x="387.445" y="-1757" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">IterRegistry</text>
<polygon fill="none" stroke="#000000" points="377.5,-1724 377.5,-1744 448.5,-1744 448.5,-1724 377.5,-1724"/>
<polygon fill="none" stroke="#000000" points="377.5,-1692 377.5,-1724 448.5,-1724 448.5,-1692 377.5,-1692"/>
<text text-anchor="start" x="394.939" y="-1705" 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="558.5,-1212 558.5,-1244 692.5,-1244 692.5,-1212 558.5,-1212"/>
<text text-anchor="start" x="605.2175" y="-1225" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Message</text>
<polygon fill="none" stroke="#000000" points="558.5,-1036 558.5,-1212 692.5,-1212 692.5,-1036 558.5,-1036"/>
<text text-anchor="start" x="588.8265" y="-1193" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">server_side:bool</text>
<text text-anchor="start" x="586.043" y="-1181" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">header_valid:bool</text>
<text text-anchor="start" x="578.814" y="-1169" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">header_len:unsigned</text>
<text text-anchor="start" x="584.648" y="-1157" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">data_len:unsigned</text>
<text text-anchor="start" x="603.8245" y="-1145" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">unique_id</text>
<text text-anchor="start" x="607.7135" y="-1133" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">node_id</text>
<text text-anchor="start" x="604.6585" y="-1121" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">sug_area</text>
<text text-anchor="start" x="575.489" y="-1109" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_recv_buffer:bytearray</text>
<text text-anchor="start" x="574.0945" y="-1097" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_send_buffer:bytearray</text>
<text text-anchor="start" x="568.2665" y="-1085" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_forward_buffer:bytearray</text>
<text text-anchor="start" x="607.7135" y="-1073" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:Infos</text>
<text text-anchor="start" x="596.326" y="-1061" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">new_data:list</text>
<text text-anchor="start" x="614.662" y="-1049" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">state</text>
<polygon fill="none" stroke="#000000" points="558.5,-968 558.5,-1036 692.5,-1036 692.5,-968 558.5,-968"/>
<text text-anchor="start" x="575.2095" y="-1017" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_read():void&lt;abstract&gt;</text>
<text text-anchor="start" x="599.9445" y="-1005" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close():void</text>
<text text-anchor="start" x="585.7725" y="-993" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">inc_counter():void</text>
<text text-anchor="start" x="584.1025" y="-981" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dec_counter():void</text>
<polygon fill="none" stroke="#000000" points="345.5,-1610 345.5,-1642 479.5,-1642 479.5,-1610 345.5,-1610"/>
<text text-anchor="start" x="392.2175" y="-1623" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Message</text>
<polygon fill="none" stroke="#000000" points="345.5,-1434 345.5,-1610 479.5,-1610 479.5,-1434 345.5,-1434"/>
<text text-anchor="start" x="375.8265" y="-1591" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">server_side:bool</text>
<text text-anchor="start" x="373.043" y="-1579" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">header_valid:bool</text>
<text text-anchor="start" x="365.814" y="-1567" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">header_len:unsigned</text>
<text text-anchor="start" x="371.648" y="-1555" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">data_len:unsigned</text>
<text text-anchor="start" x="390.8245" y="-1543" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">unique_id</text>
<text text-anchor="start" x="394.7135" y="-1531" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">node_id</text>
<text text-anchor="start" x="391.6585" y="-1519" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">sug_area</text>
<text text-anchor="start" x="362.489" y="-1507" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_recv_buffer:bytearray</text>
<text text-anchor="start" x="361.0945" y="-1495" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_send_buffer:bytearray</text>
<text text-anchor="start" x="355.2665" y="-1483" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">_forward_buffer:bytearray</text>
<text text-anchor="start" x="394.7135" y="-1471" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:Infos</text>
<text text-anchor="start" x="383.326" y="-1459" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">new_data:list</text>
<text text-anchor="start" x="401.662" y="-1447" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">state</text>
<polygon fill="none" stroke="#000000" points="345.5,-1366 345.5,-1434 479.5,-1434 479.5,-1366 345.5,-1366"/>
<text text-anchor="start" x="362.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="386.9445" y="-1403" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close():void</text>
<text text-anchor="start" x="372.7725" y="-1391" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">inc_counter():void</text>
<text text-anchor="start" x="371.1025" y="-1379" 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="M625.5,-1283.5582C625.5,-1271.4749 625.5,-1258.067 625.5,-1244.189"/>
<polygon fill="none" stroke="#000000" points="622.0001,-1283.8144 625.5,-1293.8145 629.0001,-1283.8145 622.0001,-1283.8144"/>
</g>
<!-- A15 -->
<g id="node16" class="node">
<title>A15</title>
<polygon fill="none" stroke="#000000" points="356.5,-886 356.5,-918 470.5,-918 470.5,-886 356.5,-886"/>
<text text-anchor="start" x="399.608" y="-899" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Talent</text>
<polygon fill="none" stroke="#000000" points="356.5,-782 356.5,-886 470.5,-886 470.5,-782 356.5,-782"/>
<text text-anchor="start" x="366.263" y="-867" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">await_conn_resp_cnt</text>
<text text-anchor="start" x="401.2775" y="-855" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">id_str</text>
<text text-anchor="start" x="382.1" y="-843" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">contact_name</text>
<text text-anchor="start" x="385.44" y="-831" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">contact_mail</text>
<text text-anchor="start" x="389.0445" y="-819" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:InfosG3</text>
<text text-anchor="start" x="387.384" y="-807" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">mb:Modbus</text>
<text text-anchor="start" x="399.612" y="-795" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">switch</text>
<polygon fill="none" stroke="#000000" points="356.5,-666 356.5,-782 470.5,-782 470.5,-666 356.5,-666"/>
<text text-anchor="start" x="370.9925" y="-763" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_contact_info()</text>
<text text-anchor="start" x="372.9325" y="-751" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_ota_update()</text>
<text text-anchor="start" x="378.7765" y="-739" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_get_time()</text>
<text text-anchor="start" x="366.8285" y="-727" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_collector_data()</text>
<text text-anchor="start" x="368.7735" y="-715" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_inverter_data()</text>
<text text-anchor="start" x="377.9405" y="-703" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_unknown()</text>
<text text-anchor="start" x="398.5025" y="-679" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A6&#45;&gt;A15 -->
<g id="edge21" class="edge">
<title>A6&#45;&gt;A15</title>
<path fill="none" stroke="#000000" d="M552.2302,-1011.4277C540.9417,-996.8789 529.4136,-982.0336 518.5,-968 501.1988,-945.7528 494.7669,-941.6895 479.5,-918 476.4901,-913.3296 473.4995,-908.5069 470.548,-903.5947"/>
<polygon fill="none" stroke="#000000" points="549.5765,-1013.7171 558.4715,-1019.4729 555.1073,-1009.4264 549.5765,-1013.7171"/>
</g>
<!-- A16 -->
<g id="node17" class="node">
<title>A16</title>
<polygon fill="none" stroke="#000000" points="610.5,-850 610.5,-882 701.5,-882 701.5,-850 610.5,-850"/>
<text text-anchor="start" x="628.495" y="-863" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">SolarmanV5</text>
<polygon fill="none" stroke="#000000" points="610.5,-758 610.5,-850 701.5,-850 701.5,-758 610.5,-758"/>
<text text-anchor="start" x="640.998" y="-831" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">control</text>
<text text-anchor="start" x="644.0575" y="-819" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">serial</text>
<text text-anchor="start" x="649.056" y="-807" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">snr</text>
<text text-anchor="start" x="628.21" y="-795" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:InfosG3P</text>
<text text-anchor="start" x="629.884" y="-783" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">mb:Modbus</text>
<text text-anchor="start" x="642.112" y="-771" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">switch</text>
<polygon fill="none" stroke="#000000" points="610.5,-702 610.5,-758 701.5,-758 701.5,-702 610.5,-702"/>
<text text-anchor="start" x="620.4405" y="-739" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_unknown()</text>
<text text-anchor="start" x="641.0025" y="-715" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A6&#45;&gt;A16 -->
<g id="edge22" class="edge">
<title>A6&#45;&gt;A16</title>
<path fill="none" stroke="#000000" d="M639.6776,-957.6082C642.1325,-931.9128 644.617,-905.9091 646.8668,-882.3611"/>
<polygon fill="none" stroke="#000000" points="636.1691,-957.5305 638.7021,-967.8181 643.1374,-958.1963 636.1691,-957.5305"/>
</g>
<!-- A7 -->
<g id="node8" class="node">
<title>A7</title>
<polygon fill="none" stroke="#000000" points="399.5,-584 399.5,-616 516.5,-616 516.5,-584 399.5,-584"/>
<text text-anchor="start" x="427.429" y="-597" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;&lt;AsyncIfc&gt;&gt;</text>
<polygon fill="none" stroke="#000000" points="399.5,-564 399.5,-584 516.5,-584 516.5,-564 399.5,-564"/>
<polygon fill="none" stroke="#000000" points="399.5,-268 399.5,-564 516.5,-564 516.5,-268 399.5,-268"/>
<text text-anchor="start" x="427.436" y="-545" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">set_node_id()</text>
<text text-anchor="start" x="425.766" y="-533" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">get_conn_no()</text>
<text text-anchor="start" x="439.6635" y="-509" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_add()</text>
<text text-anchor="start" x="437.444" y="-497" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_flush()</text>
<text text-anchor="start" x="441.0535" y="-485" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_get()</text>
<text text-anchor="start" x="437.1635" y="-473" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_peek()</text>
<text text-anchor="start" x="441.3335" y="-461" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_log()</text>
<text text-anchor="start" x="437.169" y="-449" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_clear()</text>
<text text-anchor="start" x="441.3335" y="-437" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_len()</text>
<text text-anchor="start" x="435.7745" y="-413" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_add()</text>
<text text-anchor="start" x="433.555" y="-401" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_flush()</text>
<text text-anchor="start" x="437.4445" y="-389" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_log()</text>
<text text-anchor="start" x="433.28" y="-377" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_clear()</text>
<text text-anchor="start" x="440.7785" y="-365" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_get()</text>
<text text-anchor="start" x="436.8885" y="-353" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_peek()</text>
<text text-anchor="start" x="441.0585" y="-341" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_log()</text>
<text text-anchor="start" x="436.894" y="-329" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_clear()</text>
<text text-anchor="start" x="441.0585" y="-317" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_len()</text>
<text text-anchor="start" x="432.999" y="-305" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_set_cb()</text>
<text text-anchor="start" x="409.3795" y="-281" 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="411.5,-182 411.5,-214 504.5,-214 504.5,-182 411.5,-182"/>
<text text-anchor="start" x="429.664" y="-195" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncIfcImpl</text>
<polygon fill="none" stroke="#000000" points="411.5,-90 411.5,-182 504.5,-182 504.5,-90 411.5,-90"/>
<text text-anchor="start" x="421.048" y="-163" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_fifo:ByteFifo</text>
<text text-anchor="start" x="424.937" y="-151" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_fifo:ByteFifo</text>
<text text-anchor="start" x="424.662" y="-139" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_fifo:ByteFifo</text>
<text text-anchor="start" x="424.096" y="-127" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">conn_no:Count</text>
<text text-anchor="start" x="440.2135" y="-115" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">node_id</text>
<text text-anchor="start" x="433.5495" y="-103" 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="M457.5,-257.632C457.5,-242.1873 457.5,-227.3874 457.5,-214.0086"/>
<polygon fill="none" stroke="#000000" points="454.0001,-257.8659 457.5,-267.8659 461.0001,-257.866 454.0001,-257.8659"/>
</g>
<!-- A9 -->
<g id="node10" class="node">
<title>A9</title>
<polygon fill="none" stroke="#000000" points="501.4532,-36 413.5468,-36 413.5468,0 501.4532,0 501.4532,-36"/>
<text text-anchor="middle" x="457.5" y="-15" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStream</text>
</g>
<!-- A8&#45;&gt;A9 -->
<g id="edge6" class="edge">
<title>A8&#45;&gt;A9</title>
<path fill="none" stroke="#000000" d="M457.5,-79.615C457.5,-63.4386 457.5,-47.6836 457.5,-36.1546"/>
<polygon fill="#000000" stroke="#000000" points="457.5,-89.7075 453.0001,-79.7074 457.5,-84.7075 457.5001,-79.7075 457.5001,-79.7075 457.5001,-79.7075 457.5,-84.7075 462.0001,-79.7075 457.5,-89.7075 457.5,-89.7075"/>
</g>
<!-- A10 -->
<g id="node11" class="node">
<title>A10</title>
<polygon fill="none" stroke="#000000" points=".5,-464 .5,-496 151.5,-496 151.5,-464 .5,-464"/>
<text text-anchor="start" x="44.0455" y="-477" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3</text>
<polygon fill="none" stroke="#000000" points=".5,-432 .5,-464 151.5,-464 151.5,-432 .5,-432"/>
<text text-anchor="start" x="10.432" y="-445" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote.stream:ConnectionG3</text>
<polygon fill="none" stroke="#000000" points=".5,-388 .5,-432 151.5,-432 151.5,-388 .5,-388"/>
<text text-anchor="start" x="56.554" y="-413" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<text text-anchor="start" x="61.0025" y="-401" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A10&#45;&gt;A3 -->
<g id="edge7" class="edge">
<title>A10&#45;&gt;A3</title>
<path fill="none" stroke="#000000" d="M103.5115,-378.5364C124.4716,-331.0488 153.0618,-266.2741 174.3025,-218.1506"/>
<polygon fill="none" stroke="#000000" points="100.2617,-377.2316 99.4257,-387.7934 106.6657,-380.0582 100.2617,-377.2316"/>
</g>
<!-- A10&#45;&gt;A9 -->
<g id="edge9" class="edge">
<title>A10&#45;&gt;A9</title>
<path fill="none" stroke="#000000" d="M65.9191,-375.3961C58.4986,-295.6629 59.6829,-163.2447 133.5,-86 170.0095,-47.7953 321.2395,-29.3905 403.5448,-22.053"/>
<polygon fill="#000000" stroke="#000000" points="65.9586,-375.7857 70.5458,-381.3497 67.1741,-387.724 62.5869,-382.16 65.9586,-375.7857"/>
<polygon fill="#000000" stroke="#000000" points="413.7128,-21.1716 404.1388,-26.5185 408.7314,-21.6034 403.7501,-22.0353 403.7501,-22.0353 403.7501,-22.0353 408.7314,-21.6034 403.3615,-17.5521 413.7128,-21.1716 413.7128,-21.1716"/>
<text text-anchor="middle" x="396.3843" y="-28.1578" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A10&#45;&gt;A10 -->
<g id="edge8" class="edge">
<title>A10&#45;&gt;A10</title>
<path fill="none" stroke="#000000" d="M129.3063,-496.0431C150.8867,-499.0964 169,-481.082 169,-442 169,-409.3299 156.3426,-391.3816 139.5832,-388.1553"/>
<polygon fill="#000000" stroke="#000000" points="129.3063,-387.9569 139.3914,-383.6508 134.3054,-388.0534 139.3044,-388.15 139.3044,-388.15 139.3044,-388.15 134.3054,-388.0534 139.2175,-392.6492 129.3063,-387.9569 129.3063,-387.9569"/>
<text text-anchor="middle" x="147.5922" y="-376.856" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">0..1</text>
<text text-anchor="middle" x="147.7917" y="-485.4082" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
</g>
<!-- A11 -->
<g id="node12" class="node">
<title>A11</title>
<polygon fill="none" stroke="#000000" points="744.5,-464 744.5,-496 901.5,-496 901.5,-464 744.5,-464"/>
<text text-anchor="start" x="787.711" y="-477" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3P</text>
<polygon fill="none" stroke="#000000" points="744.5,-432 744.5,-464 901.5,-464 901.5,-432 744.5,-432"/>
<text text-anchor="start" x="754.0975" y="-445" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote.stream:ConnectionG3P</text>
<polygon fill="none" stroke="#000000" points="744.5,-388 744.5,-432 901.5,-432 901.5,-388 744.5,-388"/>
<text text-anchor="start" x="803.554" y="-413" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<text text-anchor="start" x="808.0025" y="-401" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A11&#45;&gt;A4 -->
<g id="edge10" class="edge">
<title>A11&#45;&gt;A4</title>
<path fill="none" stroke="#000000" d="M798.6926,-378.1971C783.8063,-343.412 762.3505,-300.8772 735.5,-268 710.6165,-237.5312 676.3674,-210.0448 647.0827,-189.4838"/>
<polygon fill="none" stroke="#000000" points="795.6201,-379.9208 802.7161,-387.7883 802.0752,-377.2128 795.6201,-379.9208"/>
</g>
<!-- A11&#45;&gt;A9 -->
<g id="edge12" class="edge">
<title>A11&#45;&gt;A9</title>
<path fill="none" stroke="#000000" d="M808.4328,-376.0571C788.1602,-296.5483 743.2373,-163.9158 656.5,-86 615.9314,-49.5574 554.9588,-32.4915 511.2023,-24.5972"/>
<polygon fill="#000000" stroke="#000000" points="808.4732,-376.2202 813.8001,-381.0807 811.3623,-387.8673 806.0354,-383.0068 808.4732,-376.2202"/>
<polygon fill="#000000" stroke="#000000" points="501.3083,-22.9145 511.9213,-20.1549 506.2375,-23.7529 511.1668,-24.5912 511.1668,-24.5912 511.1668,-24.5912 506.2375,-23.7529 510.4123,-29.0275 501.3083,-22.9145 501.3083,-22.9145"/>
<text text-anchor="middle" x="520.595" y="-14.6208" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A11&#45;&gt;A11 -->
<g id="edge11" class="edge">
<title>A11&#45;&gt;A11</title>
<path fill="none" stroke="#000000" d="M878.0327,-496.0431C900.3055,-499.0964 919,-481.082 919,-442 919,-409.0245 905.6911,-391.0474 888.1533,-388.0687"/>
<polygon fill="#000000" stroke="#000000" points="878.0327,-387.9569 888.0819,-383.5677 883.0324,-388.0122 888.0321,-388.0675 888.0321,-388.0675 888.0321,-388.0675 883.0324,-388.0122 887.9823,-392.5672 878.0327,-387.9569 878.0327,-387.9569"/>
<text text-anchor="middle" x="896.2511" y="-376.7053" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">0..1</text>
<text text-anchor="middle" x="896.5075" y="-485.3826" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
</g>
<!-- A12 -->
<g id="node13" class="node">
<title>A12</title>
<polygon fill="none" stroke="#000000" points="489.5,-880 489.5,-912 592.5,-912 592.5,-880 489.5,-880"/>
<text text-anchor="start" x="530.162" y="-893" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Infos</text>
<polygon fill="none" stroke="#000000" points="489.5,-824 489.5,-880 592.5,-880 592.5,-824 489.5,-824"/>
<text text-anchor="start" x="532.9415" y="-861" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">stat</text>
<text text-anchor="start" x="508.486" y="-849" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">new_stat_data</text>
<text text-anchor="start" x="522.1035" y="-837" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">info_dev</text>
<polygon fill="none" stroke="#000000" points="489.5,-672 489.5,-824 592.5,-824 592.5,-672 489.5,-672"/>
<text text-anchor="start" x="516.8355" y="-805" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">static_init()</text>
<text text-anchor="start" x="514.8845" y="-793" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dev_value()</text>
<text text-anchor="start" x="511.8305" y="-781" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">inc_counter()</text>
<text text-anchor="start" x="510.1605" y="-769" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dec_counter()</text>
<text text-anchor="start" x="508.21" y="-757" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_proxy_conf</text>
<text text-anchor="start" x="523.213" y="-745" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_conf</text>
<text text-anchor="start" x="515.994" y="-733" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_remove</text>
<text text-anchor="start" x="517.3745" y="-721" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">update_db</text>
<text text-anchor="start" x="501.537" y="-709" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">set_db_def_value</text>
<text text-anchor="start" x="510.9855" y="-697" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">get_db_value</text>
<text text-anchor="start" x="499.3225" y="-685" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ignore_this_device</text>
</g>
<!-- A13 -->
<g id="node14" class="node">
<title>A13</title>
<polygon fill="none" stroke="#000000" points="314.5,-458 314.5,-490 381.5,-490 381.5,-458 314.5,-458"/>
<text text-anchor="start" x="330.493" y="-471" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InfosG3</text>
<polygon fill="none" stroke="#000000" points="314.5,-438 314.5,-458 381.5,-458 381.5,-438 314.5,-438"/>
<polygon fill="none" stroke="#000000" points="314.5,-394 314.5,-438 381.5,-438 381.5,-394 314.5,-394"/>
<text text-anchor="start" x="324.384" y="-419" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_confs()</text>
<text text-anchor="start" x="332.168" y="-407" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">parse()</text>
</g>
<!-- A12&#45;&gt;A13 -->
<g id="edge13" class="edge">
<title>A12&#45;&gt;A13</title>
<path fill="none" stroke="#000000" d="M482.2133,-668.9537C481.32,-667.9536 480.4156,-666.9686 479.5,-666 448.0663,-632.7472 417.2023,-652.4199 389.5,-616 361.9383,-579.7649 352.1673,-528.0191 348.8512,-490.3816"/>
<polygon fill="none" stroke="#000000" points="479.7494,-671.4639 488.8434,-676.8998 485.1241,-666.9792 479.7494,-671.4639"/>
</g>
<!-- A14 -->
<g id="node15" class="node">
<title>A14</title>
<polygon fill="none" stroke="#000000" points="659.5,-458 659.5,-490 726.5,-490 726.5,-458 659.5,-458"/>
<text text-anchor="start" x="672.1585" y="-471" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InfosG3P</text>
<polygon fill="none" stroke="#000000" points="659.5,-438 659.5,-458 726.5,-458 726.5,-438 659.5,-438"/>
<polygon fill="none" stroke="#000000" points="659.5,-394 659.5,-438 726.5,-438 726.5,-394 659.5,-394"/>
<text text-anchor="start" x="669.384" y="-419" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_confs()</text>
<text text-anchor="start" x="677.168" y="-407" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">parse()</text>
</g>
<!-- A12&#45;&gt;A14 -->
<g id="edge14" class="edge">
<title>A12&#45;&gt;A14</title>
<path fill="none" stroke="#000000" d="M597.6498,-671.6826C598.9193,-669.7598 600.2029,-667.864 601.5,-666 619.0948,-640.7144 634.6333,-642.98 649.5,-616 671.1251,-576.755 682.0274,-526.606 687.4278,-490.2373"/>
<polygon fill="none" stroke="#000000" points="594.5993,-669.9569 592.1768,-680.2711 600.5026,-673.7188 594.5993,-669.9569"/>
</g>
<!-- A15&#45;&gt;A7 -->
<g id="edge16" class="edge">
<title>A15&#45;&gt;A7</title>
<path fill="none" stroke="#000000" d="M429.385,-665.642C430.9935,-652.8472 432.6494,-639.6756 434.3143,-626.4317"/>
<polygon fill="#000000" stroke="#000000" points="435.5886,-616.295 438.8061,-626.7783 434.9649,-621.256 434.3412,-626.217 434.3412,-626.217 434.3412,-626.217 434.9649,-621.256 429.8764,-625.6556 435.5886,-616.295 435.5886,-616.295"/>
<text text-anchor="middle" x="423.2596" y="-643.6031" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">use</text>
</g>
<!-- A15&#45;&gt;A10 -->
<g id="edge15" class="edge">
<title>A15&#45;&gt;A10</title>
<path fill="none" stroke="#000000" d="M349.6312,-700.7451C337.9746,-687.9557 325.1424,-675.8414 311.5,-666 260.2851,-629.0543 226.8831,-656.5836 178.5,-616 140.443,-584.0779 112.9887,-534.285 96.0432,-496.1296"/>
<polygon fill="none" stroke="#000000" points="347.1067,-703.1737 356.3558,-708.3413 352.348,-698.5337 347.1067,-703.1737"/>
</g>
<!-- A15&#45;&gt;A13 -->
<g id="edge17" class="edge">
<title>A15&#45;&gt;A13</title>
<path fill="none" stroke="#000000" d="M389.6725,-665.642C378.9966,-609.0277 366.9296,-545.0355 358.447,-500.0525"/>
<polygon fill="#000000" stroke="#000000" points="356.5861,-490.1839 362.8613,-499.1768 357.5127,-495.0973 358.4392,-500.0107 358.4392,-500.0107 358.4392,-500.0107 357.5127,-495.0973 354.0172,-500.8446 356.5861,-490.1839 356.5861,-490.1839"/>
</g>
<!-- A16&#45;&gt;A7 -->
<g id="edge19" class="edge">
<title>A16&#45;&gt;A7</title>
<path fill="none" stroke="#000000" d="M624.6836,-701.7474C618.1571,-689.0117 610.4679,-676.6496 601.5,-666 575.2168,-634.7882 550.1961,-647.697 524.5,-616 523.7865,-615.1199 523.08,-614.2314 522.3805,-613.3347"/>
<polygon fill="#000000" stroke="#000000" points="516.2699,-605.0582 525.8298,-610.4303 519.2397,-609.0807 522.2095,-613.1032 522.2095,-613.1032 522.2095,-613.1032 519.2397,-609.0807 518.5893,-615.776 516.2699,-605.0582 516.2699,-605.0582"/>
<text text-anchor="middle" x="608.7901" y="-686.6067" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">use</text>
</g>
<!-- A16&#45;&gt;A11 -->
<g id="edge18" class="edge">
<title>A16&#45;&gt;A11</title>
<path fill="none" stroke="#000000" d="M702.9385,-692.5781C733.3829,-628.7724 771.744,-548.3749 796.6816,-496.1104"/>
<polygon fill="none" stroke="#000000" points="699.6542,-691.3338 698.5066,-701.8663 705.9719,-694.3483 699.6542,-691.3338"/>
</g>
<!-- A16&#45;&gt;A14 -->
<g id="edge20" class="edge">
<title>A16&#45;&gt;A14</title>
<path fill="none" stroke="#000000" d="M665.0284,-701.8663C671.7268,-638.5029 680.4957,-555.5538 686.3042,-500.609"/>
<polygon fill="#000000" stroke="#000000" points="687.389,-490.3473 690.8127,-500.765 686.8633,-495.3196 686.3376,-500.2919 686.3376,-500.2919 686.3376,-500.2919 686.8633,-495.3196 681.8626,-499.8187 687.389,-490.3473 687.389,-490.3473"/>
<path fill="none" stroke="#000000" d="M412.5,-1681.5582C412.5,-1669.4749 412.5,-1656.067 412.5,-1642.189"/>
<polygon fill="none" stroke="#000000" points="409.0001,-1681.8144 412.5,-1691.8145 416.0001,-1681.8145 409.0001,-1681.8144"/>
</g>
<!-- A17 -->
<g id="node18" class="node">
<title>A17</title>
<polygon fill="none" stroke="#000000" points="435.5,-1200 435.5,-1232 510.5,-1232 510.5,-1200 435.5,-1200"/>
<text text-anchor="start" x="455.2175" y="-1213" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Modbus</text>
<polygon fill="none" stroke="#000000" points="435.5,-1048 435.5,-1200 510.5,-1200 510.5,-1048 435.5,-1048"/>
<text text-anchor="start" x="464.6615" y="-1181" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">que</text>
<text text-anchor="start" x="445.49" y="-1157" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">snd_handler</text>
<text text-anchor="start" x="446.605" y="-1145" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rsp_handler</text>
<text text-anchor="start" x="456.6085" y="-1133" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">timeout</text>
<text text-anchor="start" x="446.8895" y="-1121" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">max_retires</text>
<text text-anchor="start" x="454.942" y="-1109" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">last_xxx</text>
<text text-anchor="start" x="466.8915" y="-1097" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">err</text>
<text text-anchor="start" x="453.5535" y="-1085" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">retry_cnt</text>
<text text-anchor="start" x="451.879" y="-1073" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">req_pend</text>
<text text-anchor="start" x="466.3365" y="-1061" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tim</text>
<polygon fill="none" stroke="#000000" points="435.5,-980 435.5,-1048 510.5,-1048 510.5,-980 435.5,-980"/>
<text text-anchor="start" x="446.89" y="-1029" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">build_msg()</text>
<text text-anchor="start" x="450.224" y="-1017" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">recv_req()</text>
<text text-anchor="start" x="447.724" y="-1005" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">recv_resp()</text>
<text text-anchor="start" x="458.0025" y="-993" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<polygon fill="none" stroke="#000000" points="477.5,-1284 477.5,-1316 591.5,-1316 591.5,-1284 477.5,-1284"/>
<text text-anchor="start" x="520.608" y="-1297" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Talent</text>
<polygon fill="none" stroke="#000000" points="477.5,-1180 477.5,-1284 591.5,-1284 591.5,-1180 477.5,-1180"/>
<text text-anchor="start" x="487.263" y="-1265" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">await_conn_resp_cnt</text>
<text text-anchor="start" x="522.2775" y="-1253" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">id_str</text>
<text text-anchor="start" x="503.1" y="-1241" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">contact_name</text>
<text text-anchor="start" x="506.44" y="-1229" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">contact_mail</text>
<text text-anchor="start" x="510.0445" y="-1217" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:InfosG3</text>
<text text-anchor="start" x="508.384" y="-1205" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">mb:Modbus</text>
<text text-anchor="start" x="520.612" y="-1193" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">switch</text>
<polygon fill="none" stroke="#000000" points="477.5,-1064 477.5,-1180 591.5,-1180 591.5,-1064 477.5,-1064"/>
<text text-anchor="start" x="491.9925" y="-1161" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_contact_info()</text>
<text text-anchor="start" x="493.9325" y="-1149" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_ota_update()</text>
<text text-anchor="start" x="499.7765" y="-1137" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_get_time()</text>
<text text-anchor="start" x="487.8285" y="-1125" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_collector_data()</text>
<text text-anchor="start" x="489.7735" y="-1113" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_inverter_data()</text>
<text text-anchor="start" x="498.9405" y="-1101" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_unknown()</text>
<text text-anchor="start" x="519.5025" y="-1077" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A17&#45;&gt;A15 -->
<g id="edge24" class="edge">
<title>A17&#45;&gt;A15</title>
<path fill="none" stroke="#000000" d="M446.8724,-969.6092C443.6566,-952.4944 440.3783,-935.047 437.1939,-918.0999"/>
<polygon fill="#000000" stroke="#000000" points="448.7575,-979.6415 442.4881,-970.6445 447.8341,-974.7275 446.9107,-969.8135 446.9107,-969.8135 446.9107,-969.8135 447.8341,-974.7275 451.3333,-968.9824 448.7575,-979.6415 448.7575,-979.6415"/>
<text text-anchor="middle" x="448.8482" y="-931.3534" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
<text text-anchor="middle" x="437.1032" y="-960.3879" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A17&#45;&gt;A16 -->
<g id="edge23" class="edge">
<title>A17&#45;&gt;A16</title>
<path fill="none" stroke="#000000" d="M514.9768,-1020.5466C525.3303,-1002.5556 537.0447,-984.1492 549.5,-968 569.0808,-942.6121 583.2659,-944.3717 601.5,-918 609.1473,-906.9397 616.0494,-894.6241 622.1627,-882.146"/>
<polygon fill="#000000" stroke="#000000" points="510.0062,-1029.3335 511.0131,-1018.414 512.4681,-1024.9816 514.9299,-1020.6296 514.9299,-1020.6296 514.9299,-1020.6296 512.4681,-1024.9816 518.8467,-1022.8453 510.0062,-1029.3335 510.0062,-1029.3335"/>
<text text-anchor="middle" x="621.6642" y="-899.1398" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
<text text-anchor="middle" x="511.574" y="-1006.3951" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
<!-- A6&#45;&gt;A17 -->
<g id="edge25" class="edge">
<title>A6&#45;&gt;A17</title>
<path fill="none" stroke="#000000" d="M469.9446,-1356.1508C475.1142,-1342.8455 480.3179,-1329.4522 485.4067,-1316.355"/>
<polygon fill="none" stroke="#000000" points="466.5478,-1355.2293 466.1885,-1365.8181 473.0726,-1357.7645 466.5478,-1355.2293"/>
</g>
<!-- A18 -->
<g id="node19" class="node">
<title>A18</title>
<polygon fill="none" stroke="#000000" points="534.5,-470 534.5,-502 641.5,-502 641.5,-470 534.5,-470"/>
<text text-anchor="start" x="558.2695" y="-483" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ModbusConn</text>
<polygon fill="none" stroke="#000000" points="534.5,-402 534.5,-470 641.5,-470 641.5,-402 534.5,-402"/>
<text text-anchor="start" x="578.5515" y="-451" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">host</text>
<text text-anchor="start" x="579.387" y="-439" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">port</text>
<text text-anchor="start" x="577.997" y="-427" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="544.383" y="-415" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">stream:InverterG3P</text>
<polygon fill="none" stroke="#000000" points="534.5,-382 534.5,-402 641.5,-402 641.5,-382 534.5,-382"/>
<polygon fill="none" stroke="#000000" points="368.5,-1248 368.5,-1280 459.5,-1280 459.5,-1248 368.5,-1248"/>
<text text-anchor="start" x="386.495" y="-1261" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">SolarmanV5</text>
<polygon fill="none" stroke="#000000" points="368.5,-1156 368.5,-1248 459.5,-1248 459.5,-1156 368.5,-1156"/>
<text text-anchor="start" x="398.998" y="-1229" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">control</text>
<text text-anchor="start" x="402.0575" y="-1217" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">serial</text>
<text text-anchor="start" x="407.056" y="-1205" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">snr</text>
<text text-anchor="start" x="386.21" y="-1193" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">db:InfosG3P</text>
<text text-anchor="start" x="387.884" y="-1181" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">mb:Modbus</text>
<text text-anchor="start" x="400.112" y="-1169" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">switch</text>
<polygon fill="none" stroke="#000000" points="368.5,-1100 368.5,-1156 459.5,-1156 459.5,-1100 368.5,-1100"/>
<text text-anchor="start" x="378.4405" y="-1137" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">msg_unknown()</text>
<text text-anchor="start" x="399.0025" y="-1113" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A18&#45;&gt;A4 -->
<g id="edge25" class="edge">
<title>A18&#45;&gt;A4</title>
<path fill="none" stroke="#000000" d="M587.5,-381.9118C587.5,-335.4458 587.5,-271.0175 587.5,-222.1832"/>
<polygon fill="#000000" stroke="#000000" points="587.5,-212.0112 592.0001,-222.0112 587.5,-217.0112 587.5001,-222.0112 587.5001,-222.0112 587.5001,-222.0112 587.5,-217.0112 583.0001,-222.0113 587.5,-212.0112 587.5,-212.0112"/>
<text text-anchor="middle" x="595.9524" y="-227.1374" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
<text text-anchor="middle" x="579.0476" y="-360.7857" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
<!-- A6&#45;&gt;A18 -->
<g id="edge26" class="edge">
<title>A6&#45;&gt;A18</title>
<path fill="none" stroke="#000000" d="M412.9726,-1355.6082C413.0544,-1329.9128 413.1372,-1303.9091 413.2122,-1280.3611"/>
<polygon fill="none" stroke="#000000" points="409.472,-1355.807 412.9401,-1365.8181 416.472,-1355.8293 409.472,-1355.807"/>
</g>
<!-- A7 -->
<g id="node8" class="node">
<title>A7</title>
<polygon fill="none" stroke="#000000" points="359.5,-982 359.5,-1014 476.5,-1014 476.5,-982 359.5,-982"/>
<text text-anchor="start" x="387.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="359.5,-962 359.5,-982 476.5,-982 476.5,-962 359.5,-962"/>
<polygon fill="none" stroke="#000000" points="359.5,-666 359.5,-962 476.5,-962 476.5,-666 359.5,-666"/>
<text text-anchor="start" x="387.436" y="-943" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">set_node_id()</text>
<text text-anchor="start" x="385.766" y="-931" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">get_conn_no()</text>
<text text-anchor="start" x="399.6635" y="-907" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_add()</text>
<text text-anchor="start" x="397.444" y="-895" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_flush()</text>
<text text-anchor="start" x="401.0535" y="-883" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_get()</text>
<text text-anchor="start" x="397.1635" y="-871" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_peek()</text>
<text text-anchor="start" x="401.3335" y="-859" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_log()</text>
<text text-anchor="start" x="397.169" y="-847" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_clear()</text>
<text text-anchor="start" x="401.3335" y="-835" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_len()</text>
<text text-anchor="start" x="395.7745" y="-811" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_add()</text>
<text text-anchor="start" x="393.555" y="-799" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_flush()</text>
<text text-anchor="start" x="397.4445" y="-787" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_log()</text>
<text text-anchor="start" x="393.28" y="-775" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_clear()</text>
<text text-anchor="start" x="400.7785" y="-763" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_get()</text>
<text text-anchor="start" x="396.8885" y="-751" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_peek()</text>
<text text-anchor="start" x="401.0585" y="-739" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_log()</text>
<text text-anchor="start" x="396.894" y="-727" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_clear()</text>
<text text-anchor="start" x="401.0585" y="-715" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_len()</text>
<text text-anchor="start" x="392.999" y="-703" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_set_cb()</text>
<text text-anchor="start" x="369.3795" y="-679" 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="419.5,-574 419.5,-606 512.5,-606 512.5,-574 419.5,-574"/>
<text text-anchor="start" x="437.664" y="-587" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncIfcImpl</text>
<polygon fill="none" stroke="#000000" points="419.5,-482 419.5,-574 512.5,-574 512.5,-482 419.5,-482"/>
<text text-anchor="start" x="429.048" y="-555" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">fwd_fifo:ByteFifo</text>
<text text-anchor="start" x="432.937" y="-543" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tx_fifo:ByteFifo</text>
<text text-anchor="start" x="432.662" y="-531" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rx_fifo:ByteFifo</text>
<text text-anchor="start" x="432.096" y="-519" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">conn_no:Count</text>
<text text-anchor="start" x="448.2135" y="-507" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">node_id</text>
<text text-anchor="start" x="441.5495" y="-495" 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="M447.3711,-655.7951C450.2352,-638.133 452.9805,-621.2037 455.4297,-606.0999"/>
<polygon fill="none" stroke="#000000" points="443.9147,-655.2446 445.7688,-665.6759 450.8244,-656.3651 443.9147,-655.2446"/>
</g>
<!-- A9 -->
<g id="node10" class="node">
<title>A9</title>
<polygon fill="none" stroke="#000000" points="632.5,-390 632.5,-422 734.5,-422 734.5,-390 632.5,-390"/>
<text text-anchor="start" x="653.774" y="-403" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStream</text>
<polygon fill="none" stroke="#000000" points="632.5,-310 632.5,-390 734.5,-390 734.5,-310 632.5,-310"/>
<text text-anchor="start" x="669.053" y="-371" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">reader</text>
<text text-anchor="start" x="671.283" y="-359" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">writer</text>
<text text-anchor="start" x="673.497" y="-347" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">addr</text>
<text text-anchor="start" x="669.053" y="-335" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">r_addr</text>
<text text-anchor="start" x="669.608" y="-323" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">l_addr</text>
<polygon fill="none" stroke="#000000" points="632.5,-182 632.5,-310 734.5,-310 734.5,-182 632.5,-182"/>
<text text-anchor="start" x="655.154" y="-279" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">&lt;async&gt;loop</text>
<text text-anchor="start" x="671.282" y="-267" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">disc()</text>
<text text-anchor="start" x="668.5025" y="-255" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
<text text-anchor="start" x="664.054" y="-243" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<text text-anchor="start" x="648.7705" y="-219" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__async_read()</text>
<text text-anchor="start" x="648.221" y="-207" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">__async_write()</text>
<text text-anchor="start" x="642.107" y="-195" 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="M520.8892,-510.356C553.7908,-488.3116 594.5961,-457.1309 623.5,-422 626.5337,-418.3127 629.4664,-414.4464 632.2946,-410.4535"/>
<polygon fill="#000000" stroke="#000000" points="512.2723,-516.0433 518.1395,-506.779 516.4453,-513.289 520.6184,-510.5348 520.6184,-510.5348 520.6184,-510.5348 516.4453,-513.289 523.0972,-514.2905 512.2723,-516.0433 512.2723,-516.0433"/>
</g>
<!-- A10 -->
<g id="node11" class="node">
<title>A10</title>
<polygon fill="none" stroke="#000000" points="412.5,-100 412.5,-132 590.5,-132 590.5,-100 412.5,-100"/>
<text text-anchor="start" x="457.0515" y="-113" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStreamServer</text>
<polygon fill="none" stroke="#000000" points="412.5,-68 412.5,-100 590.5,-100 590.5,-68 412.5,-68"/>
<text text-anchor="start" x="453.4325" y="-81" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">async_create_remote</text>
<polygon fill="none" stroke="#000000" points="412.5,0 412.5,-68 590.5,-68 590.5,0 412.5,0"/>
<text text-anchor="start" x="453.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="443.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="422.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="486.5025" y="-13" 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="M626.6147,-186.3084C625.5862,-184.8529 624.5479,-183.4159 623.5,-182 610.634,-164.6155 595.0122,-147.5888 579.3028,-132.1656"/>
<polygon fill="#000000" stroke="#000000" points="632.3941,-194.8307 623.057,-189.08 629.5877,-190.6925 626.7814,-186.5543 626.7814,-186.5543 626.7814,-186.5543 629.5877,-190.6925 630.5058,-184.0286 632.3941,-194.8307 632.3941,-194.8307"/>
</g>
<!-- A11 -->
<g id="node12" class="node">
<title>A11</title>
<polygon fill="none" stroke="#000000" points="608.5,-82 608.5,-114 746.5,-114 746.5,-82 608.5,-82"/>
<text text-anchor="start" x="634.997" y="-95" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">AsyncStreamClient</text>
<polygon fill="none" stroke="#000000" points="608.5,-62 608.5,-82 746.5,-82 746.5,-62 608.5,-62"/>
<polygon fill="none" stroke="#000000" points="608.5,-18 608.5,-62 746.5,-62 746.5,-18 608.5,-18"/>
<text text-anchor="start" x="631.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="618.324" y="-31" 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="M680.19,-171.8077C679.6675,-151.2556 679.1577,-131.2022 678.7248,-114.1772"/>
<polygon fill="#000000" stroke="#000000" points="680.4473,-181.9259 675.6945,-172.0435 680.3201,-176.9275 680.193,-171.9291 680.193,-171.9291 680.193,-171.9291 680.3201,-176.9275 684.6916,-171.8147 680.4473,-181.9259 680.4473,-181.9259"/>
</g>
<!-- A12 -->
<g id="node13" class="node">
<title>A12</title>
<polygon fill="none" stroke="#000000" points="445.5,-324 445.5,-356 596.5,-356 596.5,-324 445.5,-324"/>
<text text-anchor="start" x="489.0455" y="-337" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3</text>
<polygon fill="none" stroke="#000000" points="445.5,-292 445.5,-324 596.5,-324 596.5,-292 445.5,-292"/>
<text text-anchor="start" x="455.432" y="-305" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">remote.stream:ConnectionG3</text>
<polygon fill="none" stroke="#000000" points="445.5,-248 445.5,-292 596.5,-292 596.5,-248 445.5,-248"/>
<text text-anchor="start" x="501.554" y="-273" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<text text-anchor="start" x="506.0025" y="-261" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A12&#45;&gt;A3 -->
<g id="edge9" class="edge">
<title>A12&#45;&gt;A3</title>
<path fill="none" stroke="#000000" d="M478.5092,-239.4979C465.2404,-220.6454 450.1954,-200.1473 435.5,-182 421.2752,-164.4338 405.1062,-146.1424 389.7235,-129.4175"/>
<polygon fill="none" stroke="#000000" points="475.6778,-241.5563 484.2763,-247.7463 481.4146,-237.5453 475.6778,-241.5563"/>
</g>
<!-- A12&#45;&gt;A10 -->
<g id="edge12" class="edge">
<title>A12&#45;&gt;A10</title>
<path fill="none" stroke="#000000" d="M515.169,-235.7838C512.8253,-206.6727 510.0594,-172.3163 507.6308,-142.1514"/>
<polygon fill="#000000" stroke="#000000" points="515.1779,-235.8955 519.6466,-241.5552 516.141,-247.8568 511.6724,-242.1972 515.1779,-235.8955"/>
<polygon fill="#000000" stroke="#000000" points="506.8213,-132.0959 512.1093,-141.7025 507.2226,-137.0798 507.6239,-142.0637 507.6239,-142.0637 507.6239,-142.0637 507.2226,-137.0798 503.1384,-142.4248 506.8213,-132.0959 506.8213,-132.0959"/>
<text text-anchor="middle" x="516.701" y="-146.4853" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">0..1</text>
</g>
<!-- A12&#45;&gt;A11 -->
<g id="edge11" class="edge">
<title>A12&#45;&gt;A11</title>
<path fill="none" stroke="#000000" d="M563.2934,-237.6736C587.1695,-201.7835 616.6458,-157.4751 639.6718,-122.8628"/>
<polygon fill="#000000" stroke="#000000" points="563.1656,-237.8657 563.1727,-245.0768 556.519,-247.8568 556.5119,-240.6457 563.1656,-237.8657"/>
<polygon fill="#000000" stroke="#000000" points="645.3795,-114.283 643.5873,-125.1015 642.6101,-118.446 639.8406,-122.609 639.8406,-122.609 639.8406,-122.609 642.6101,-118.446 636.0939,-120.1165 645.3795,-114.283 645.3795,-114.283"/>
<text text-anchor="middle" x="642.3771" y="-131.0564" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">0..1</text>
</g>
<!-- A12&#45;&gt;A12 -->
<g id="edge10" class="edge">
<title>A12&#45;&gt;A12</title>
<path fill="none" stroke="#000000" d="M596.0725,-341.7099C606.8009,-335.2874 614,-322.0508 614,-302 614,-287.2752 610.1175,-276.2253 603.8059,-268.8503"/>
<polygon fill="#000000" stroke="#000000" points="596.0725,-262.2901 606.6094,-265.3275 599.8854,-265.5246 603.6983,-268.7591 603.6983,-268.7591 603.6983,-268.7591 599.8854,-265.5246 600.7872,-272.1907 596.0725,-262.2901 596.0725,-262.2901"/>
<text text-anchor="middle" x="615.3629" y="-264.5703" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">0..1</text>
<text text-anchor="middle" x="606.2442" y="-321.4897" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
</g>
<!-- A13 -->
<g id="node14" class="node">
<title>A13</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="295.711" y="-337" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ConnectionG3P</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="311.554" y="-273" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">healthy()</text>
<text text-anchor="start" x="316.0025" y="-261" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A13&#45;&gt;A4 -->
<g id="edge13" class="edge">
<title>A13&#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"/>
</g>
<!-- A13&#45;&gt;A10 -->
<g id="edge16" class="edge">
<title>A13&#45;&gt;A10</title>
<path fill="none" stroke="#000000" d="M376.9343,-237.9153C398.7618,-207.7907 424.9166,-171.6941 447.6125,-140.3711"/>
<polygon fill="#000000" stroke="#000000" points="376.7718,-238.1395 376.4904,-245.3452 369.7309,-247.8568 370.0122,-240.6512 376.7718,-238.1395"/>
<polygon fill="#000000" stroke="#000000" points="453.6085,-132.0959 451.385,-142.834 450.6747,-136.1448 447.741,-140.1937 447.741,-140.1937 447.741,-140.1937 450.6747,-136.1448 444.097,-137.5533 453.6085,-132.0959 453.6085,-132.0959"/>
<text text-anchor="middle" x="449.8176" y="-148.7334" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">0..1</text>
</g>
<!-- A13&#45;&gt;A11 -->
<g id="edge15" class="edge">
<title>A13&#45;&gt;A11</title>
<path fill="none" stroke="#000000" d="M375.0938,-238.1141C391.9986,-217.7599 412.7221,-196.7271 435.5,-182 499.4911,-140.6266 532.594,-168.472 599.5,-132 605.8177,-128.5561 612.0915,-124.5466 618.1768,-120.2372"/>
<polygon fill="#000000" stroke="#000000" points="374.8907,-238.3658 374.2369,-245.5473 367.3564,-247.7058 368.0102,-240.5244 374.8907,-238.3658"/>
<polygon fill="#000000" stroke="#000000" points="626.3446,-114.1997 620.9779,-123.7627 622.3238,-117.1718 618.303,-120.1439 618.303,-120.1439 618.303,-120.1439 622.3238,-117.1718 615.6281,-116.5252 626.3446,-114.1997 626.3446,-114.1997"/>
<text text-anchor="middle" x="616.7925" y="-128.7713" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">0..1</text>
</g>
<!-- A13&#45;&gt;A13 -->
<g id="edge14" class="edge">
<title>A13&#45;&gt;A13</title>
<path fill="none" stroke="#000000" d="M409.2551,-341.2562C419.9076,-334.6752 427,-321.5898 427,-302 427,-287.6137 423.175,-276.7353 416.924,-269.3648"/>
<polygon fill="#000000" stroke="#000000" points="409.2551,-262.7438 419.7652,-265.8726 413.0398,-266.0113 416.8244,-269.2788 416.8244,-269.2788 416.8244,-269.2788 413.0398,-266.0113 413.8837,-272.685 409.2551,-262.7438 409.2551,-262.7438"/>
<text text-anchor="middle" x="428.4989" y="-265.1913" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">0..1</text>
<text text-anchor="middle" x="419.2213" y="-320.9162" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
</g>
<!-- A14 -->
<g id="node15" class="node">
<title>A14</title>
<polygon fill="none" stroke="#000000" points="610.5,-1278 610.5,-1310 713.5,-1310 713.5,-1278 610.5,-1278"/>
<text text-anchor="start" x="651.162" y="-1291" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Infos</text>
<polygon fill="none" stroke="#000000" points="610.5,-1222 610.5,-1278 713.5,-1278 713.5,-1222 610.5,-1222"/>
<text text-anchor="start" x="653.9415" y="-1259" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">stat</text>
<text text-anchor="start" x="629.486" y="-1247" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">new_stat_data</text>
<text text-anchor="start" x="643.1035" y="-1235" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">info_dev</text>
<polygon fill="none" stroke="#000000" points="610.5,-1070 610.5,-1222 713.5,-1222 713.5,-1070 610.5,-1070"/>
<text text-anchor="start" x="637.8355" y="-1203" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">static_init()</text>
<text text-anchor="start" x="635.8845" y="-1191" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dev_value()</text>
<text text-anchor="start" x="632.8305" y="-1179" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">inc_counter()</text>
<text text-anchor="start" x="631.1605" y="-1167" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">dec_counter()</text>
<text text-anchor="start" x="629.21" y="-1155" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_proxy_conf</text>
<text text-anchor="start" x="644.213" y="-1143" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_conf</text>
<text text-anchor="start" x="636.994" y="-1131" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_remove</text>
<text text-anchor="start" x="638.3745" y="-1119" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">update_db</text>
<text text-anchor="start" x="622.537" y="-1107" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">set_db_def_value</text>
<text text-anchor="start" x="631.9855" y="-1095" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">get_db_value</text>
<text text-anchor="start" x="620.3225" y="-1083" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ignore_this_device</text>
</g>
<!-- A15 -->
<g id="node16" class="node">
<title>A15</title>
<polygon fill="none" stroke="#000000" points="625.5,-856 625.5,-888 692.5,-888 692.5,-856 625.5,-856"/>
<text text-anchor="start" x="641.493" y="-869" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InfosG3</text>
<polygon fill="none" stroke="#000000" points="625.5,-836 625.5,-856 692.5,-856 692.5,-836 625.5,-836"/>
<polygon fill="none" stroke="#000000" points="625.5,-792 625.5,-836 692.5,-836 692.5,-792 625.5,-792"/>
<text text-anchor="start" x="635.384" y="-817" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_confs()</text>
<text text-anchor="start" x="643.168" y="-805" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">parse()</text>
</g>
<!-- A14&#45;&gt;A15 -->
<g id="edge17" class="edge">
<title>A14&#45;&gt;A15</title>
<path fill="none" stroke="#000000" d="M660.3792,-1059.2448C659.8663,-999.4063 659.2901,-932.1816 658.9126,-888.1352"/>
<polygon fill="none" stroke="#000000" points="656.8819,-1059.5803 660.4676,-1069.5499 663.8816,-1059.5202 656.8819,-1059.5803"/>
</g>
<!-- A16 -->
<g id="node17" class="node">
<title>A16</title>
<polygon fill="none" stroke="#000000" points="494.5,-856 494.5,-888 561.5,-888 561.5,-856 494.5,-856"/>
<text text-anchor="start" x="507.1585" y="-869" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">InfosG3P</text>
<polygon fill="none" stroke="#000000" points="494.5,-836 494.5,-856 561.5,-856 561.5,-836 494.5,-836"/>
<polygon fill="none" stroke="#000000" points="494.5,-792 494.5,-836 561.5,-836 561.5,-792 494.5,-792"/>
<text text-anchor="start" x="504.384" y="-817" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ha_confs()</text>
<text text-anchor="start" x="512.168" y="-805" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">parse()</text>
</g>
<!-- A14&#45;&gt;A16 -->
<g id="edge18" class="edge">
<title>A14&#45;&gt;A16</title>
<path fill="none" stroke="#000000" d="M611.7233,-1059.9862C588.7427,-999.9623 562.8621,-932.3636 545.9289,-888.1352"/>
<polygon fill="none" stroke="#000000" points="608.5406,-1061.4623 615.3848,-1069.5499 615.0779,-1058.9595 608.5406,-1061.4623"/>
</g>
<!-- A17&#45;&gt;A7 -->
<g id="edge20" class="edge">
<title>A17&#45;&gt;A7</title>
<path fill="none" stroke="#000000" d="M492.2603,-1063.642C487.9413,-1050.7218 483.4938,-1037.4173 479.0227,-1024.0422"/>
<polygon fill="#000000" stroke="#000000" points="475.7643,-1014.295 483.2027,-1022.3525 477.3496,-1019.0371 478.9348,-1023.7792 478.9348,-1023.7792 478.9348,-1023.7792 477.3496,-1019.0371 474.667,-1025.2059 475.7643,-1014.295 475.7643,-1014.295"/>
<text text-anchor="middle" x="478.4973" y="-1046.1306" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">use</text>
</g>
<!-- A17&#45;&gt;A12 -->
<g id="edge19" class="edge">
<title>A17&#45;&gt;A12</title>
<path fill="none" stroke="#000000" d="M565.2328,-1053.4379C567.3751,-1040.1646 569.1985,-1026.8579 570.5,-1014 586.0765,-860.1197 581.0485,-820.3065 570.5,-666 562.9303,-555.2676 542.5519,-426.9031 530.2736,-356.0308"/>
<polygon fill="none" stroke="#000000" points="561.7353,-1053.1328 563.5359,-1063.5735 568.6392,-1054.2888 561.7353,-1053.1328"/>
</g>
<!-- A17&#45;&gt;A15 -->
<g id="edge21" class="edge">
<title>A17&#45;&gt;A15</title>
<path fill="none" stroke="#000000" d="M585.0948,-1063.9652C591.4654,-1047.2285 597.7556,-1030.2447 603.5,-1014 617.0546,-975.6684 630.8409,-932.0419 641.2203,-898.0618"/>
<polygon fill="#000000" stroke="#000000" points="644.1909,-888.2953 645.5861,-899.1721 642.7359,-893.079 641.2808,-897.8626 641.2808,-897.8626 641.2808,-897.8626 642.7359,-893.079 636.9756,-896.553 644.1909,-888.2953 644.1909,-888.2953"/>
</g>
<!-- A18&#45;&gt;A7 -->
<g id="edge23" class="edge">
<title>A18&#45;&gt;A7</title>
<path fill="none" stroke="#000000" d="M414.5301,-1099.8663C414.7969,-1076.5184 415.0942,-1050.5112 415.3946,-1024.2257"/>
<polygon fill="#000000" stroke="#000000" points="415.5098,-1014.1428 419.8951,-1024.1937 415.4526,-1019.1425 415.3954,-1024.1422 415.3954,-1024.1422 415.3954,-1024.1422 415.4526,-1019.1425 410.8957,-1024.0907 415.5098,-1014.1428 415.5098,-1014.1428"/>
<text text-anchor="middle" x="406.2854" y="-1078.6447" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">use</text>
</g>
<!-- A18&#45;&gt;A13 -->
<g id="edge22" class="edge">
<title>A18&#45;&gt;A13</title>
<path fill="none" stroke="#000000" d="M370.901,-1090.1369C362.2256,-1065.6623 354.2942,-1039.2378 349.5,-1014 303.5767,-772.2495 317.5688,-476.11 326.0763,-356.2204"/>
<polygon fill="none" stroke="#000000" points="367.6944,-1091.5616 374.3895,-1099.773 374.2763,-1089.1787 367.6944,-1091.5616"/>
</g>
<!-- A18&#45;&gt;A16 -->
<g id="edge24" class="edge">
<title>A18&#45;&gt;A16</title>
<path fill="none" stroke="#000000" d="M452.8317,-1099.5532C463.8885,-1072.3429 475.3733,-1042.2139 484.5,-1014 496.8342,-975.8705 507.6409,-932.0683 515.3355,-897.951"/>
<polygon fill="#000000" stroke="#000000" points="517.5217,-888.1455 519.7377,-898.8851 516.4336,-893.0257 515.3455,-897.9059 515.3455,-897.9059 515.3455,-897.9059 516.4336,-893.0257 510.9533,-896.9266 517.5217,-888.1455 517.5217,-888.1455"/>
</g>
<!-- A19 -->
<g id="node20" class="node">
<title>A19</title>
<polygon fill="none" stroke="#000000" points="498.5,-1598 498.5,-1630 573.5,-1630 573.5,-1598 498.5,-1598"/>
<text text-anchor="start" x="518.2175" y="-1611" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">Modbus</text>
<polygon fill="none" stroke="#000000" points="498.5,-1446 498.5,-1598 573.5,-1598 573.5,-1446 498.5,-1446"/>
<text text-anchor="start" x="527.6615" y="-1579" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">que</text>
<text text-anchor="start" x="508.49" y="-1555" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">snd_handler</text>
<text text-anchor="start" x="509.605" y="-1543" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rsp_handler</text>
<text text-anchor="start" x="519.6085" y="-1531" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">timeout</text>
<text text-anchor="start" x="509.8895" y="-1519" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">max_retires</text>
<text text-anchor="start" x="517.942" y="-1507" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">last_xxx</text>
<text text-anchor="start" x="529.8915" y="-1495" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">err</text>
<text text-anchor="start" x="516.5535" y="-1483" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">retry_cnt</text>
<text text-anchor="start" x="514.879" y="-1471" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">req_pend</text>
<text text-anchor="start" x="529.3365" y="-1459" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tim</text>
<polygon fill="none" stroke="#000000" points="498.5,-1378 498.5,-1446 573.5,-1446 573.5,-1378 498.5,-1378"/>
<text text-anchor="start" x="509.89" y="-1427" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">build_msg()</text>
<text text-anchor="start" x="513.224" y="-1415" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">recv_req()</text>
<text text-anchor="start" x="510.724" y="-1403" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">recv_resp()</text>
<text text-anchor="start" x="521.0025" y="-1391" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">close()</text>
</g>
<!-- A19&#45;&gt;A17 -->
<g id="edge28" class="edge">
<title>A19&#45;&gt;A17</title>
<path fill="none" stroke="#000000" d="M535.0656,-1367.6092C535.0111,-1350.4944 534.9556,-1333.047 534.9016,-1316.0999"/>
<polygon fill="#000000" stroke="#000000" points="535.0976,-1377.6415 530.5657,-1367.6559 535.0816,-1372.6415 535.0656,-1367.6415 535.0656,-1367.6415 535.0656,-1367.6415 535.0816,-1372.6415 539.5656,-1367.6272 535.0976,-1377.6415 535.0976,-1377.6415"/>
<text text-anchor="middle" x="543.4116" y="-1331.199" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
<text text-anchor="middle" x="526.5875" y="-1356.5423" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A19&#45;&gt;A18 -->
<g id="edge27" class="edge">
<title>A19&#45;&gt;A18</title>
<path fill="none" stroke="#000000" d="M494.4368,-1381.825C492.4631,-1376.4654 490.4791,-1371.1707 488.5,-1366 481.9997,-1349.0167 467.3384,-1314.3617 452.687,-1280.2598"/>
<polygon fill="#000000" stroke="#000000" points="497.9749,-1391.5299 490.3219,-1383.6762 496.2623,-1386.8324 494.5497,-1382.1348 494.5497,-1382.1348 494.5497,-1382.1348 496.2623,-1386.8324 498.7775,-1380.5934 497.9749,-1391.5299 497.9749,-1391.5299"/>
<text text-anchor="middle" x="467.6003" y="-1290.5862" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">has</text>
<text text-anchor="middle" x="483.8253" y="-1374.3953" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
</g>
<!-- A20 -->
<g id="node21" class="node">
<title>A20</title>
<polygon fill="none" stroke="#000000" points=".5,-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"/>
</g>
<!-- A20&#45;&gt;A4 -->
<g id="edge29" class="edge">
<title>A20&#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>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

@@ -14,18 +14,25 @@
[<<AsyncIfc>>||set_node_id();get_conn_no();;tx_add();tx_flush();tx_get();tx_peek();tx_log();tx_clear();tx_len();;fwd_add();fwd_flush();fwd_log();fwd_clear();rx_get();rx_peek();rx_log();rx_clear();rx_len();rx_set_cb();;prot_set_timeout_cb()]
[AsyncIfcImpl|fwd_fifo:ByteFifo;tx_fifo:ByteFifo;rx_fifo:ByteFifo;conn_no:Count;node_id;timeout_cb]
[AsyncStream|reader;writer;addr;r_addr;l_addr|;<async>loop;disc();close();healthy();;__async_read();__async_write();__async_forward()]
[AsyncStreamServer|async_create_remote|<async>server_loop();<async>_async_forward();<async>publish_outstanding_mqtt();close()]
[AsyncStreamClient||<async>client_loop();<async>_async_forward())]
[<<AsyncIfc>>]^-.-[AsyncIfcImpl]
[AsyncIfcImpl]<-[AsyncStream]
[AsyncStream|reader;writer;addr;r_addr;l_addr|<async>server_loop();<async>client_loop();<async>loop;disc();close();;__async_read();async_write();__async_forward()]
[AsyncStream]<-[AsyncStreamServer]
[AsyncStream]<-[AsyncStreamClient]
[ConnectionG3|remote.stream:ConnectionG3|healthy();close()]
[ConnectionG3]^[InverterG3]
[ConnectionG3]has-0..1>[ConnectionG3]
[ConnectionG3]++-1>[AsyncStream]
[ConnectionG3]++-0..1>[AsyncStreamClient]
[ConnectionG3]++-0..1>[AsyncStreamServer]
[ConnectionG3P|remote.stream:ConnectionG3P|healthy();close()]
[ConnectionG3P]^[InverterG3P]
[ConnectionG3P]has-0..1>[ConnectionG3P]
[ConnectionG3P]++-1>[AsyncStream]
[ConnectionG3P]++-0..1>[AsyncStreamClient]
[ConnectionG3P]++-0..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]
[Infos]^[InfosG3||ha_confs();parse()]

View File

@@ -7,10 +7,12 @@ from typing import Self
from itertools import count
if __name__ == "app.src.async_stream":
from app.src.inverter import Inverter
from app.src.byte_fifo import ByteFifo
from app.src.async_ifc import AsyncIfc
from app.src.infos import Infos
else: # pragma: no cover
from inverter import Inverter
from byte_fifo import ByteFifo
from async_ifc import AsyncIfc
from infos import Infos
@@ -156,15 +158,13 @@ class AsyncStream(AsyncIfcImpl):
'''maximum default time without a received msg in sec'''
def __init__(self, reader: StreamReader, writer: StreamWriter,
addr, async_publ_mqtt, async_create_remote,
rstream: "StreamPtr") -> None:
addr, rstream: "StreamPtr") -> None:
AsyncIfcImpl.__init__(self)
logger.debug('AsyncStream.__init__')
self.remote = rstream
self.tx_fifo.reg_trigger(self.__write_cb)
self.async_create_remote = async_create_remote
self._reader = reader
self._writer = writer
self.addr = addr
@@ -172,7 +172,7 @@ class AsyncStream(AsyncIfcImpl):
self.l_addr = ''
self.proc_start = None # start processing start timestamp
self.proc_max = 0
self.async_publ_mqtt = async_publ_mqtt
self.async_publ_mqtt = None # will be set AsyncStreamServer only
def __write_cb(self):
self._writer.write(self.tx_fifo.get())
@@ -182,56 +182,6 @@ class AsyncStream(AsyncIfcImpl):
return self.timeout_cb
return 360
async def publish_outstanding_mqtt(self):
'''Publish all outstanding MQTT topics'''
try:
if self.unique_id:
await self.async_publ_mqtt()
await self._async_publ_mqtt_proxy_stat('proxy')
except Exception:
pass
async def server_loop(self, addr: str) -> None:
'''Loop for receiving messages from the inverter (server-side)'''
logger.info(f'[{self.node_id}:{self.conn_no}] '
f'Accept connection from {addr}')
Infos.inc_counter('Inverter_Cnt')
await self.publish_outstanding_mqtt()
await self.loop()
Infos.dec_counter('Inverter_Cnt')
await self.publish_outstanding_mqtt()
logger.info(f'[{self.node_id}:{self.conn_no}] Server loop stopped for'
f' r{self.r_addr}')
# if the server connection closes, we also have to disconnect
# the connection to te TSUN cloud
if self.remote.stream:
logger.info(f'[{self.node_id}:{self.conn_no}] disc client '
f'connection: [{self.remote.ifc.node_id}:'
f'{self.remote.ifc.conn_no}]')
await self.remote.ifc.disc()
async def client_loop(self, _: str) -> None:
'''Loop for receiving messages from the TSUN cloud (client-side)'''
client_stream = await self.remote.ifc.loop()
logger.info(f'[{client_stream.node_id}:{client_stream.conn_no}] '
'Client loop stopped for'
f' l{client_stream.l_addr}')
# if the client connection closes, we don't touch the server
# connection. Instead we erase the client connection stream,
# thus on the next received packet from the inverter, we can
# establish a new connection to the TSUN cloud
# erase backlink to inverter
client_stream.remote.stream = None
if self.remote.stream == client_stream:
# logging.debug(f'Client l{client_stream.l_addr} refs:'
# f' {gc.get_referrers(client_stream)}')
# than erase client connection
self.remote.stream = None
async def loop(self) -> Self:
"""Async loop handler for precessing all received messages"""
self.r_addr = self._writer.get_extra_info('peername')
@@ -247,10 +197,10 @@ class AsyncStream(AsyncIfcImpl):
await asyncio.wait_for(self.__async_read(),
dead_conn_to)
# if self.unique_id:
await self.__async_write()
await self.__async_forward()
await self.async_publ_mqtt()
if self.async_publ_mqtt:
await self.async_publ_mqtt()
except asyncio.TimeoutError:
logger.warning(f'[{self.node_id}:{self.conn_no}] Dead '
@@ -282,13 +232,6 @@ class AsyncStream(AsyncIfcImpl):
f"{traceback.format_exc()}")
await asyncio.sleep(0) # be cooperative to other task
async def __async_write(self, headline: str = 'Transmit to ') -> None:
"""Async write handler to transmit the send_buffer"""
if len(self.tx_fifo) > 0:
self.tx_fifo.logging(logging.INFO, f'{headline}{self.addr}:')
self._writer.write(self.tx_fifo.get())
await self._writer.drain()
async def disc(self) -> None:
"""Async disc handler for graceful disconnect"""
if self._writer.is_closing():
@@ -302,7 +245,6 @@ class AsyncStream(AsyncIfcImpl):
hint: must be called before releasing the connection instance
"""
self.async_create_remote = None
super().close()
self._reader.feed_eof() # abort awaited read
if self._writer.is_closing():
@@ -337,23 +279,19 @@ class AsyncStream(AsyncIfcImpl):
else:
raise RuntimeError("Peer closed.")
async def __async_write(self, headline: str = 'Transmit to ') -> None:
"""Async write handler to transmit the send_buffer"""
if len(self.tx_fifo) > 0:
self.tx_fifo.logging(logging.INFO, f'{headline}{self.addr}:')
self._writer.write(self.tx_fifo.get())
await self._writer.drain()
async def __async_forward(self) -> None:
"""forward handler transmits data over the remote connection"""
if len(self.fwd_fifo) == 0:
return
try:
if not self.remote.stream:
await self.async_create_remote()
if self.remote.stream:
if self.remote.ifc.init_new_client_conn_cb():
await self.remote.ifc.__async_write()
if self.remote.stream:
self.remote.ifc.update_header_cb(self.fwd_fifo.peek())
self.fwd_fifo.logging(logging.INFO, 'Forward to '
f'{self.remote.ifc.addr}:')
self.remote.ifc._writer.write(self.fwd_fifo.get())
await self.remote.ifc._writer.drain()
await self._async_forward()
except OSError as error:
if self.remote.stream:
@@ -382,3 +320,103 @@ class AsyncStream(AsyncIfcImpl):
def __del__(self):
logger.debug(
f"AsyncStream.__del__ l{self.l_addr} | r{self.r_addr}")
class AsyncStreamServer(AsyncStream):
def __init__(self, reader: StreamReader, writer: StreamWriter,
addr, async_publ_mqtt, async_create_remote,
rstream: "StreamPtr") -> None:
AsyncStream.__init__(self, reader, writer, addr,
rstream)
self.async_create_remote = async_create_remote
self.async_publ_mqtt = async_publ_mqtt
async def server_loop(self, addr: str) -> None:
'''Loop for receiving messages from the inverter (server-side)'''
logger.info(f'[{self.node_id}:{self.conn_no}] '
f'Accept connection from {addr}')
Infos.inc_counter('Inverter_Cnt')
await self.publish_outstanding_mqtt()
await self.loop()
Infos.dec_counter('Inverter_Cnt')
await self.publish_outstanding_mqtt()
logger.info(f'[{self.node_id}:{self.conn_no}] Server loop stopped for'
f' r{self.r_addr}')
# if the server connection closes, we also have to disconnect
# the connection to te TSUN cloud
if self.remote.stream:
logger.info(f'[{self.node_id}:{self.conn_no}] disc client '
f'connection: [{self.remote.ifc.node_id}:'
f'{self.remote.ifc.conn_no}]')
await self.remote.ifc.disc()
async def _async_forward(self) -> None:
"""forward handler transmits data over the remote connection"""
if not self.remote.stream:
await self.async_create_remote()
if self.remote.stream and \
self.remote.ifc.init_new_client_conn_cb():
await self.remote.ifc._AsyncStream__async_write()
if self.remote.stream:
self.remote.ifc.update_header_cb(self.fwd_fifo.peek())
self.fwd_fifo.logging(logging.INFO, 'Forward to '
f'{self.remote.ifc.addr}:')
self.remote.ifc._writer.write(self.fwd_fifo.get())
await self.remote.ifc._writer.drain()
async def publish_outstanding_mqtt(self):
'''Publish all outstanding MQTT topics'''
try:
await self.async_publ_mqtt()
await Inverter._async_publ_mqtt_proxy_stat('proxy')
except Exception:
pass
def close(self) -> None:
"""close handler for a no waiting disconnect
hint: must be called before releasing the connection instance
"""
self.async_create_remote = None
self.async_publ_mqtt = None
super().close()
class AsyncStreamClient(AsyncStream):
def __init__(self, reader: StreamReader, writer: StreamWriter,
addr, rstream: "StreamPtr") -> None:
AsyncStream.__init__(self, reader, writer, addr,
rstream)
async def client_loop(self, _: str) -> None:
'''Loop for receiving messages from the TSUN cloud (client-side)'''
await self.loop()
logger.info(f'[{self.node_id}:{self.conn_no}] '
'Client loop stopped for'
f' l{self.l_addr}')
server_stream = self.remote.stream
# if the client connection closes, we don't touch the server
# connection. Instead we erase the client connection stream,
# thus on the next received packet from the inverter, we can
# establish a new connection to the TSUN cloud
if server_stream.remote.ifc == self:
# logging.debug(f'Client l{client_stream.l_addr} refs:'
# f' {gc.get_referrers(client_stream)}')
# than erase client connection
server_stream.remote.stream = None # erases stream and ifc link
# erase backlink to inverter
self.remote.stream = None
async def _async_forward(self) -> None:
"""forward handler transmits data over the remote connection"""
if self.remote.stream:
self.remote.ifc.update_header_cb(self.fwd_fifo.peek())
self.fwd_fifo.logging(logging.INFO, 'Forward to '
f'{self.remote.ifc.addr}:')
self.remote.ifc._writer.write(self.fwd_fifo.get())
await self.remote.ifc._writer.drain()

View File

@@ -2,10 +2,12 @@ import logging
from asyncio import StreamReader, StreamWriter
if __name__ == "app.src.gen3.connection_g3":
from app.src.async_stream import AsyncStream, StreamPtr
from app.src.async_stream import AsyncStreamServer
from app.src.async_stream import AsyncStreamClient, StreamPtr
from app.src.gen3.talent import Talent
else: # pragma: no cover
from async_stream import AsyncStream, StreamPtr
from async_stream import AsyncStreamServer
from async_stream import AsyncStreamClient, StreamPtr
from gen3.talent import Talent
logger = logging.getLogger('conn')
@@ -17,10 +19,14 @@ class ConnectionG3(Talent):
addr, rstream: 'ConnectionG3', server_side: bool,
id_str=b'') -> None:
self.remote = StreamPtr(rstream)
self._ifc = AsyncStream(reader, writer, addr,
self.async_publ_mqtt,
self.async_create_remote,
self.remote)
if server_side:
self._ifc = AsyncStreamServer(reader, writer, addr,
self.async_publ_mqtt,
self.async_create_remote,
self.remote)
else:
self._ifc = AsyncStreamClient(reader, writer, addr,
self.remote)
Talent.__init__(self, server_side, self._ifc, id_str)
self.conn_no = self._ifc.get_conn_no()

View File

@@ -71,7 +71,7 @@ class InverterG3(Inverter, ConnectionG3):
logging.info(f'[{self.remote.stream.node_id}:'
f'{self.remote.stream.conn_no}] '
f'Connected to {addr}')
asyncio.create_task(self._ifc.client_loop(addr))
asyncio.create_task(self.remote.ifc.client_loop(addr))
except (ConnectionRefusedError, TimeoutError) as error:
logging.info(f'{error}')
@@ -83,6 +83,8 @@ class InverterG3(Inverter, ConnectionG3):
async def async_publ_mqtt(self) -> None:
'''publish data to MQTT broker'''
if not self.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:
@@ -97,7 +99,7 @@ class InverterG3(Inverter, ConnectionG3):
for key in self.new_data:
await self.__async_publ_mqtt_packet(key)
for key in Infos.new_stat_data:
await self._async_publ_mqtt_proxy_stat(key)
await Inverter._async_publ_mqtt_proxy_stat(key)
except MqttCodeError as error:
logging.error(f'Mqtt except: {error}')
@@ -118,8 +120,6 @@ class InverterG3(Inverter, ConnectionG3):
async def __register_home_assistant(self) -> None:
'''register all our topics at home assistant'''
if not self.unique_id:
return
for data_json, component, node_id, id in self.db.ha_confs(
self.entity_prfx, self.node_id, self.unique_id,
self.sug_area):

View File

@@ -2,10 +2,12 @@ import logging
from asyncio import StreamReader, StreamWriter
if __name__ == "app.src.gen3plus.connection_g3p":
from app.src.async_stream import AsyncStream, StreamPtr
from app.src.async_stream import AsyncStreamServer
from app.src.async_stream import AsyncStreamClient, StreamPtr
from app.src.gen3plus.solarman_v5 import SolarmanV5
else: # pragma: no cover
from async_stream import AsyncStream, StreamPtr
from async_stream import AsyncStreamServer
from async_stream import AsyncStreamClient, StreamPtr
from gen3plus.solarman_v5 import SolarmanV5
logger = logging.getLogger('conn')
@@ -19,10 +21,15 @@ class ConnectionG3P(SolarmanV5):
client_mode: bool) -> None:
self.remote = StreamPtr(rstream)
self._ifc = AsyncStream(reader, writer, addr,
self.async_publ_mqtt,
self.async_create_remote,
self.remote)
if server_side:
self._ifc = AsyncStreamServer(reader, writer, addr,
self.async_publ_mqtt,
self.async_create_remote,
self.remote)
else:
self._ifc = AsyncStreamClient(reader, writer, addr,
self.remote)
SolarmanV5.__init__(self, server_side, client_mode, self._ifc)
self.conn_no = self._ifc.get_conn_no()

View File

@@ -74,7 +74,7 @@ class InverterG3P(Inverter, ConnectionG3P):
logging.info(f'[{self.remote.stream.node_id}:'
f'{self.remote.stream.conn_no}] '
f'Connected to {addr}')
asyncio.create_task(self._ifc.client_loop(addr))
asyncio.create_task(self.remote.ifc.client_loop(addr))
except (ConnectionRefusedError, TimeoutError) as error:
logging.info(f'{error}')
@@ -86,6 +86,9 @@ class InverterG3P(Inverter, ConnectionG3P):
async def async_publ_mqtt(self) -> None:
'''publish data to MQTT broker'''
if not self.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:
@@ -100,7 +103,7 @@ class InverterG3P(Inverter, ConnectionG3P):
for key in self.new_data:
await self.__async_publ_mqtt_packet(key)
for key in Infos.new_stat_data:
await self._async_publ_mqtt_proxy_stat(key)
await Inverter._async_publ_mqtt_proxy_stat(key)
except MqttCodeError as error:
logging.error(f'Mqtt except: {error}')

View File

@@ -1,13 +0,0 @@
class ObjectFactory:
def __init__(self):
self._builders = {}
def register_builder(self, key, builder):
self._builders[key] = builder
def create(self, key, **kwargs):
builder = self._builders.get(key)
if not builder:
raise ValueError(key)
return builder(**kwargs)

View File

@@ -171,6 +171,7 @@ async def test_mqtt_publish(config_conn, patch_open_connection, patch_conn_close
Inverter.class_init()
inverter = InverterG3(FakeReader(), FakeWriter(), ('proxy.local', 10000))
await inverter.async_publ_mqtt() # check call with invalid unique_id
inverter._Talent__set_serial_no(serial_no= "123344")
inverter.new_data['inverter'] = True

View File

@@ -172,6 +172,7 @@ 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)
await inverter.async_publ_mqtt() # check call with invalid unique_id
inverter._SolarmanV5__set_serial_no(snr= 123344)
inverter.new_data['inverter'] = True