RJ 12 Connector	       Bl    1 nc             socket(soladin)
      6  5  4  3  2  1	       Bl/wi 2 RX -           1  2  3  4  5  6
   ____________________	       Or    3 RX +         ___________________
   | || || || || || || |       Or/Wi 4 TX +	   | || || || || || || |
   | || || || || || || |       Gr    5 TX -        |                   |
   |                   |       Gr/Wi 6 nc          |                   |
   |_____frontview_____|                           |_____frontview____ |
         |_______|                                        [______]
           |___| 


		   
         ARDUINO                   RJ 12 connector       
    
      TX(D7) �--------------------------� 2  (TX-) Gr
                         ____                           
    + 3.3V   �----------[____]----------� 3  (TX+) Or/Wi            
                         150R                               
                         ____
    + 3.3V   �----------[____]-----†
                          10K      |
      RX(D6) �---------------------†----� 4  (RX+) Or	

     gnd     �--------------------------� 5  (RX-) Bl/Wi	
     
     
   
#include <ESP8266WiFi.h>
#include <PubSubClient.h>          // https://github.com/adafruit/Adafruit_MQTT_Library
#include <WiFiManager.h>           // https://github.com/tzapu/WiFiManager
#include <WiFiClient.h>
#include <Ticker.h>
#include <SoftwareSerial.h>        // standard softwareserial library from esp8266
#include <Soladin.h>               // https://github.com/teding/SolaDin

SoftwareSerial solCom(12, 13);     // wemos D1 Mini D6 D7  serial to connect to soladin  
Soladin sol ;                 

WiFiClient espClient;
PubSubClient client(espClient);
Ticker ticker; 
WiFiManager wifiManager;

boolean solConnect = false;
unsigned long last;
byte retries = 0;
boolean successQ = false;

const char* mqtt_server = "mqtt.server.com";
const char* mqtt_user = "<user>";
const char* mqtt_pass = "<password>";
const char* PVVoltTopic = "solar/PVVolt";
const char* PVAmpTopic = "solar/PVAmp";
const char* GridFreqTopic = "solar/GridFreq";
const char* GridVoltTopic = "solar/GridVolt";
const char* GridPowerTopic = "solar/GridPower";
const char* DevTempTopic = "solar/DeviceTemp";
const char* TotalPowerTopic = "solar/TotalPower";

void setup() {
  Serial.begin(115200);
  pinMode(BUILTIN_LED, OUTPUT);
  ticker.attach(0.6, tick);
  wifiManager.setAPCallback(configModeCallback);
  if (!wifiManager.autoConnect("Soladin")) {
    Serial.println("failed to connect and hit timeout");
    ESP.reset(); 
    delay(1000);
  }
  ticker.detach();
  digitalWrite(BUILTIN_LED, LOW);

  solCom.begin(9600); 
  sol.begin(&solCom);

  last = millis();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);  
}


void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  
  retries = 0;
  while ((! solConnect) && (retries <  6)){
   Serial.println("trying connection to soladin");
   solConnect = sol.query(PRB);    
   delay(1000*retries);
    retries++;
   Serial.print("tries = ");
   Serial.println(retries);
  } 
    
    if (((long)(millis()-last) > 60000) && (WiFi.status() == WL_CONNECTED) && solConnect) {
      successQ = false;
      retries = 0;
        while ((! successQ) && (retries < 6)) {      
          Serial.println("query soladin");
          successQ = sol.query(DVS);
          if (! successQ) {
            delay(1000*retries);
            retries++;
          }            
        }
      solConnect = successQ;   
      if (solConnect) {
        Serial.print("PV Voltage :");
        Serial.println(String(float(sol.PVvolt)/10).c_str());
        Serial.print("V \n PV Current :");
        Serial.println(String(float(sol.PVamp)/100).c_str());
        Serial.print("A \n Grid Frequency :");
        Serial.println(String(float(sol.Gridfreq)/100).c_str());
        Serial.print("Hz \n Grid Voltage :");
        Serial.println(String(sol.Gridvolt).c_str());
        Serial.print("V \n Current Grid Power  :");
        Serial.println(String(sol.Gridpower).c_str());
        Serial.print("W \n Device Temperature :");
        Serial.println(String(sol.DeviceTemp).c_str());
        Serial.print("C \n Total Power :");
        Serial.println(String(float(sol.Totalpower)/100).c_str());
        Serial.print("kWh");
        
        client.publish(PVVoltTopic, String(float(sol.PVvolt)/10).c_str());
        client.publish(PVAmpTopic, String(float(sol.PVamp)/100).c_str());
        client.publish(GridFreqTopic, String(float(sol.Gridfreq)/100).c_str());
        client.publish(GridVoltTopic, String(sol.Gridvolt).c_str());
        client.publish(GridPowerTopic, String(sol.Gridpower).c_str());
        client.publish(DevTempTopic, String(sol.DeviceTemp).c_str());
        client.publish(TotalPowerTopic, String(float(sol.Totalpower)/100).c_str());
        last = millis();        
      }
    }
  
  delay(1000+(retries*10000));
}

void tick()
{
  //toggle state
  int state = digitalRead(BUILTIN_LED);
  digitalWrite(BUILTIN_LED, !state);
}

void configModeCallback (WiFiManager *myWiFiManager) {
  Serial.println("Entered config mode");
  Serial.println(WiFi.softAPIP());
  //if you used auto generated SSID, print it
  Serial.println(myWiFiManager->getConfigPortalSSID());
  //entered config mode, make led toggle faster
  ticker.attach(0.2, tick);
}


void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.print("\n");  
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    if (client.connect(clientId.c_str(),mqtt_user, mqtt_pass)) {
      Serial.println("connected");  
      client.subscribe(PVVoltTopic);  
      client.subscribe(PVAmpTopic);  
      client.subscribe(GridFreqTopic);  
      client.subscribe(GridVoltTopic);  
      client.subscribe(GridPowerTopic);  
      client.subscribe(DevTempTopic);  
      client.subscribe(TotalPowerTopic);  
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}