// {type:class} // {direction:topDown} // {generate:true} [note: You can stick notes on diagrams too!{bg:cornsilk}] [IterRegistry||__iter__] [Mqtt;<>|ha_restarts;__client;__cb_MqttIsUp|publish();close()] [Inverter|cls.db_stat;cls.entity_prfx;cls.discovery_prfx;cls.proxy_node_id;cls.proxy_unique_id;cls.mqtt:Mqtt;;__ha_restarts|async_create_remote(inv_prot, conn_class)async_publ_mqtt()] [InverterBase||disc(shutdown_started);async_create_remote();healthy()] [Inverter]^[InverterBase] [InverterBase]^[InverterG3|addr;remote:StreamPtr;local:StreamPtr|async_create_remote();;close()] [InverterBase]^[InverterG3P|addr;remote:StreamPtr;local:StreamPtr|async_create_remote();;close()] [Inverter]++->[Mqtt;<>] [IterRegistry]^[Inverter|server_side:bool;header_valid:bool;header_len:unsigned;data_len:unsigned;unique_id;node_id;sug_area;_recv_buffer:bytearray;_send_buffer:bytearray;_forward_buffer:bytearray;db:Infos;new_data:list;state|_read():void;close():void;inc_counter():void;dec_counter():void] [<>||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|;loop;disc();close();healthy();;__async_read();__async_write();__async_forward()] [AsyncStreamServer|async_create_remote|server_loop();_async_forward();publish_outstanding_mqtt();close()] [AsyncStreamClient||client_loop();_async_forward())] [<>]^-.-[AsyncIfcImpl] [AsyncIfcImpl]^[AsyncStream] [AsyncStream]^[AsyncStreamServer] [AsyncStream]^[AsyncStreamClient] [Talent|ifc:AsyncIfc;conn_no;addr;;await_conn_resp_cnt;id_str;contact_name;contact_mail;db:InfosG3;mb:Modbus;switch|msg_contact_info();msg_ota_update();msg_get_time();msg_collector_data();msg_inverter_data();msg_unknown();;healthy();close()] [Talent][AsyncStreamClient] [Talent]<-local++[InverterG3] [InverterG3]++local->[AsyncStreamServer] [SolarmanV5|ifc:AsyncIfc;conn_no;addr;;control;serial;snr;db:InfosG3P;mb:Modbus;switch|msg_unknown();;healthy();close()] [SolarmanV5][AsyncStreamClient] [SolarmanV5]<-local++[InverterG3P] [InverterG3P]++local->[AsyncStreamServer] [Infos|stat;new_stat_data;info_dev|static_init();dev_value();inc_counter();dec_counter();ha_proxy_conf;ha_conf;ha_remove;update_db;set_db_def_value;get_db_value;ignore_this_device] [Infos]^[InfosG3||ha_confs();parse()] [Infos]^[InfosG3P||ha_confs();parse()] [Talent]^[ConnectionG3] [Talent]use->[<>] [Talent]->[InfosG3] [SolarmanV5]use->[<>] [SolarmanV5]->[InfosG3P] [IterRegistry]^[Message|node_id|inc_counter();dec_counter()] [Message]^[Talent] [Message]^[SolarmanV5] [Modbus|que;;snd_handler;rsp_handler;timeout;max_retires;last_xxx;err;retry_cnt;req_pend;tim|build_msg();recv_req();recv_resp();close()] [Modbus]<1-has[SolarmanV5] [Modbus]<1-has[Talent] [ModbusConn|host;port;addr;stream:InverterG3P;|]has-1>[InverterG3P]