ESPEasy konfigurierbarer Software Serial Server

Begonnen von PeMue, 03 April 2018, 21:51:53

Vorheriges Thema - Nächstes Thema

PeMue

Hallo zusammen,

ich habe mal versucht, immis/amunras bzw. chons ESPEasy plugin Modul für die Softserial Schnittstelle konfigurierbar zu machen, siehe (oder im Anhang):
/*
* This plug in is based on a plugin written by immi/amunra/chons
* Parts of the plugin are derived from _P149_MHZ19.ino
* numbering from https://github.com/letscontrolit/ESPEasyPluginPlayground (132 is not used,
* therefore changed from 130 to 132.
*
* This plugin enables a software serial port on ESP8266 to a WiFi network
* (similar to _P020_Ser2Net, but uses different pins and therefore softwareserial).
*
* DevicePin1 - is RX for ESP
* DevicePin2 - is TX for ESP
*
* version: 0.1 04/03/2018 PeMue
*/

// uncomment in case of use as official plugin
//#ifdef USES_P132

// chose one of the stati
//build all the normal stable plugins
//#define PLUGIN_BUILD_NORMAL
//build all plugins that are in test stadium
//#define PLUGIN_BUILD_TESTING
//build all plugins that still are being developed and are broken or incomplete
//#define PLUGIN_BUILD_DEV

// plugin definitions
#define PLUGIN_132
#define PLUGIN_ID_132         132
#define PLUGIN_NAME_132       "Software Serial Server"
#define PLUGIN_VALUENAME1_132 "SwSerSrv"

#define BUFFER_SIZE_SW 128
boolean Plugin_132_init = false;

WiFiServer *ser2netServerSW;
WiFiClient ser2netClientSW;

#include <SoftwareSerial.h>
// old starts from immi/amunra/chons, will be replaced after chosing GPIO pins
//SoftwareSerial swSer(14, 12, false, 256); DEVKIT 1.0 for test ...
// receive 14 --> D5, transmit 12 --> D6, invert, buffersize 
// receive 14 --> D5, transmit 12 --> D6, invert, buffersize
// receive: D7/GPIO13, transmit: D8/GPIO15 (Wemos D1 Mini)
// SoftwareSerial swSer(13, 15, false, 256);
SoftwareSerial *Plugin_132_SS; // from P149

boolean Plugin_132(byte function, struct EventStruct *event, String& string)
{
  boolean success = false;

  switch (function)
  {
    case PLUGIN_DEVICE_ADD:
    {
      Device[++deviceCount].Number = PLUGIN_ID_132;
      Device[deviceCount].Type = DEVICE_TYPE_SINGLE;
      Device[deviceCount].VType = SENSOR_TYPE_SINGLE;
      //Device[deviceCount].Ports = 0; // why is this missing ???
      Device[deviceCount].PullUpOption       = false; // added
      Device[deviceCount].InverseLogicOption = false; // added
      Device[deviceCount].Custom = true;
      Device[deviceCount].TimerOption = false;
      break;
    }

    case PLUGIN_GET_DEVICENAME:
    {
      string = F(PLUGIN_NAME_132);
      break;
    }

    case PLUGIN_GET_DEVICEVALUENAMES:
    {
      strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[0], PSTR(PLUGIN_VALUENAME1_132));
      break;
    }

    case PLUGIN_WEBFORM_LOAD:
    {
      char tmpString[128];
      sprintf_P(tmpString, PSTR("<TR><TD>TCP Port:<TD><input type='text' name='plugin_132_port' value='%u'>"), ExtraTaskSettings.TaskDevicePluginConfigLong[0]);
      string += tmpString;
      sprintf_P(tmpString, PSTR("<TR><TD>Baud Rate:<TD><input type='text' name='plugin_132_baud' value='%u'>"), ExtraTaskSettings.TaskDevicePluginConfigLong[1]);
      string += tmpString;
   
      //addFormNote(string, F("1st GPIO is ESP Rx pin=GPIO-13, 2nd GPIO is ESP Tx pin=GPIO-15.")); // from P149, modified, not in ESPEasy v1.x
      string += F("<TR><TD>Select ESP Rx pin:<TD>");
      addPinSelect(false, string, "taskdevicepin1", Settings.TaskDevicePin1[event->TaskIndex]);
      string += F("<TR><TD>Select ESP Tx pin:<TD>");
      addPinSelect(false, string, "taskdevicepin2", Settings.TaskDevicePin2[event->TaskIndex]);

      // from https://github.com/letscontrolit/ESPEasyPluginPlayground/blob/master/_P142_RGB-Strip.ino
      //  string += F("<TR><TD>1st GPIO (R):<TD>");
      //  addPinSelect(false, string, "taskdevicepin1", Settings.TaskDevicePluginConfig[event->TaskIndex][0]);
      //  string += F("<TR><TD>2nd GPIO (G):<TD>");
      //  addPinSelect(false, string, "taskdevicepin2", Settings.TaskDevicePluginConfig[event->TaskIndex][1]);
      //  string += F("<TR><TD>3rd GPIO (B):<TD>");
      //  addPinSelect(false, string, "taskdevicepin3", Settings.TaskDevicePluginConfig[event->TaskIndex][2]);
       
      success = true;
      break;
    }

    case PLUGIN_WEBFORM_SAVE:
    {
      // chosen GPIOs will not be saved, why ???
      String plugin1 = WebServer.arg("plugin_132_port");
      ExtraTaskSettings.TaskDevicePluginConfigLong[0] = plugin1.toInt();
      String plugin2 = WebServer.arg("plugin_132_baud");
      ExtraTaskSettings.TaskDevicePluginConfigLong[1] = plugin2.toInt();
      SaveTaskSettings(event->TaskIndex);
      success = true;
      break;
    }

    case PLUGIN_INIT:
    {
      LoadTaskSettings(event->TaskIndex);
      //int irPin = Settings.TaskDevicePin1[event->TaskIndex];
      //irPin=14;
      // if ((ExtraTaskSettings.TaskDevicePluginConfigLong[0] != 0) && (ExtraTaskSettings.TaskDevicePluginConfigLong[1] != 0) && (irPin != -1))
      // if (Settings.TaskDevicePin1[event->TaskIndex] != -1 && Settings.TaskDevicePin2[event->TaskIndex] != -1) // from P149
      if ((ExtraTaskSettings.TaskDevicePluginConfigLong[0] != 0) && (ExtraTaskSettings.TaskDevicePluginConfigLong[1] != 0) && (Settings.TaskDevicePin1[event->TaskIndex] != -1) && (Settings.TaskDevicePin2[event->TaskIndex] != -1)) // combined
      {
        Plugin_132_SS = new SoftwareSerial(Settings.TaskDevicePin1[event->TaskIndex], Settings.TaskDevicePin2[event->TaskIndex], false, 256); // from P149, added logic, buffer
        //swSer.begin(ExtraTaskSettings.TaskDevicePluginConfigLong[1]);
        Plugin_132_SS->begin(ExtraTaskSettings.TaskDevicePluginConfigLong[1]);
       
        ser2netServerSW = new WiFiServer(ExtraTaskSettings.TaskDevicePluginConfigLong[0]);
        ser2netServerSW->begin();
        // uncomment, in case logging is needed
        //String log =String((ExtraTaskSettings.TaskDevicePluginConfigLong[1]),DEC);
        //addLog(LOG_LEVEL_INFO,log);
        Plugin_132_init = true;
      }
      success = true;
      break;
    }

    // repeat ten times per second (main loop)
    case PLUGIN_TEN_PER_SECOND:
    {
      if (Plugin_132_init)
      {
        size_t bytes_read;
        if (!ser2netClientSW)
        {
          while (Plugin_132_SS->available()) // swSer replaced by Plugin_132_SS, . replaced by ->
          {
            Plugin_132_SS->read();
          }
          ser2netClientSW = ser2netServerSW->available();
        }

        if (ser2netClientSW.connected())
        {
          uint8_t net_buf[BUFFER_SIZE_SW];
          int count = ser2netClientSW.available();
          if (count > 0) {
            if (count > BUFFER_SIZE_SW)
              count = BUFFER_SIZE_SW;
            bytes_read = ser2netClientSW.read(net_buf, count);
            Plugin_132_SS->write(net_buf, bytes_read);
            //Plugin_132_SS->flush();
            net_buf[count]=0;
            //addLog(LOG_LEVEL_DEBUG,(char*)net_buf);
          }
          uint8_t serial_buf[BUFFER_SIZE_SW];
          size_t bytes_read = 0;
          while (Plugin_132_SS->available() && bytes_read < BUFFER_SIZE_SW) {
            serial_buf[bytes_read] = Plugin_132_SS->read();
            bytes_read++;
          }
          if (bytes_read > 0)
          {
            ser2netClientSW.write((const uint8_t*)serial_buf, bytes_read);
            ser2netClientSW.flush();
          }
          serial_buf[bytes_read]=0;
          //addLog(LOG_LEVEL_DEBUG,(char*)serial_buf);
        }
        else
        {
          ser2netClientSW.stop();
          Plugin_132_SS->flush();
        }
        success = true;
      }
      break;
    }
  }
  return success;
}

//#endif // USES_P132
//#endif // PLUGIN_BUILD_TESTING


Man sieht, ich bin nicht so der Programmierer:
der erste Pin ist konfigurierbar. Den zweiten Pin kann man auswählen, aber er verschwindet beim Speichern wieder. Vielleicht hat mal jemand Muße und genügend Sachverstand, mal drüberzuschauen.
Ich habe das Ganze in der Version R148 compiliert, um den Einfluss von Compilerfehlern zu minimieren. Einfach das ZIP entpacken, _P130_SSSRV.ino löschen und durch _P132_SSSRV.ino ersetzen. Mein compiliertes BIN hängt ebenfalls zu Testzuwecken an.

Momentan bin ich froh, dass es compiliert, habe aber keine Ahnung, warum ein Pin funktioniert und der zweite nicht  >:( >:( >:(
Auslesen eines DS18B20 funktioniert   ;D ;D ;D

Danke + Gruß

Peter

Edit:
Ich glaube, ich hab's gefunden, siehe https://diyprojects.io/esp-easy-develop-plugins/
ZitatDEVICE_TYPE_DUAL (4): Device connected using 2 digital inputs
Muss ich morgen gleich mal probieren ...
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

PeMue

Hallo zusammen,

es scheint auf den ersten Blick zu funktionieren. Das plugin bzw. die compilierte BIN (4 MByte Module) hängt an. Wer testen will, ist herzlich eingeladen. So wie es aussieht, erkennt ESPEasy nicht, welche Pins schon belegt sind und welche nicht. Ggf. muss man auch die Debug-Meldungen, die auf die serielle Schnittstelle gehen, unterdrücken (zumindest habe ich beim Testen welche gesehen).

Gruß PeMue
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

carlos

Hallo Peter,
Gleich mal auf dem HMUART von dir ausprobiert, funktioniert bestens.
Gruß

Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

andies

Das HM-UART von eq3 liest und schreibt mE mit 115200 baud. Das heisst, ich kann den seriellen Server nicht nehmen, richtig?
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

PeMue

Ich weiß nicht, welche Library chons/immi genommen hat, aber wenn es diese https://github.com/plerup/espsoftwareserial ist, dann könnte es mit 115200 baut gehen. Einfach mal probieren und berichten.

Gruß Peter
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

andies

Zitat von: PeMue am 07 September 2019, 08:40:44
Einfach mal probieren und berichten.
Gibt es im Forum die Möglichkeit, Orden zu vergeben? Du würdest so was wie "Held der Arbeit" (https://de.wikipedia.org/wiki/Held_der_Arbeit) von mir bekommen: Seit einem halben Jahr (ungelogen!) versuche ich, mit ESP Mega eine Serielle Verbindung und einem ESP07/Wemos mit externer Antenne (ist auf dem Dachboden mit sehr schwachem WLAN) hinzubekommen. Nichts ging. Und Dein Sketch geht out-of-the-box?!

Da sieht man mal wieder, dass die neuesten updates nicht unbedingt eine Verbesserung bringen. Vielleicht lag es auch an der Firmware des HM-Teils, die war nämlich outdated.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

PeMue

Zitat von: andies am 07 September 2019, 11:15:27
Du würdest so was wie "Held der Arbeit" (https://de.wikipedia.org/wiki/Held_der_Arbeit) von mir bekommen: ...
Und ich dachte, diese Auszeichnung gibt's nicht für Wessies  :o. Freut mich, dass es funktioniert.
Ich versuche mich/scheitere gerade an der Implementierung des plugins in ESPEasy 2.0  ???. Aber vorher muss ich leider Steuererklärung machen  :( :( :( :( :(.

Gruß Peter
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

andies

ich bin auch daran gescheitert. Keine Ahnung, wieso die frühere Firmware geht und die neue nicht.


Gesendet von iPad mit Tapatalk Pro
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

Zu früh gefreut:

2019.09.08 11:14:26 1: HMUARTLGW WLAN_HmUART2 invalid checksum received, dropping frame (FD001501BC0500003E79861062EBE50000008AC0D6146400FD4D)!
2019.09.08 11:17:01 1: HMUARTLGW WLAN_HmUART2 invalid checksum received, dropping frame (FD000500AB04020250ED)!
2019.09.08 11:18:51 1: HMUARTLGW WLAN_HmUART2 invalid checksum received, dropping frame (FD000500B30402207AFF)!
2019.09.08 11:20:26 1: HMUARTLGW WLAN_HmUART2 invalid checksum received, dropping frame (FD000500BA412020D8FB)!
2019.09.08 11:31:24 1: HMUARTLGW WLAN_HmUART2 invalid checksum received, dropping frame (FD0005001E302020BAFF)!
2019.09.08 11:37:05 1: HMUARTLGW WLAN_HmUART2 invalid checksum received, dropping frame (FD000500FF042020C9FF)!
2019.09.08 13:52:36 1: HMUARTLGW WLAN_HmUART2 invalid checksum received, dropping frame (FD00050021040200E8EB)!
2019.09.08 15:06:09 1: HMUARTLGW WLAN_HmUART2 invalid checksum received, dropping frame (FD000500480402006CE9)!
2019.09.08 15:08:14 1: HMUARTLGW WLAN_HmUART2 invalid checksum received, dropping frame (FD00050051040280D6FF)!
2019.09.08 17:00:00 1: PERL WARNING: Argument "" isn't numeric in numeric gt (>) at (eval 191551) line 1.
2019.09.08 17:38:35 1: HMUARTLGW WLAN_HmUART2 invalid checksum received, dropping frame (FD001001530500004E188002676767600D4A008FEC)!

Jetzt vermute ich aber eine andere Ursache. Software Serial ist bekannt dafür, bei hohen baud-Zahlen die Flanken nicht genau zu erkennen. Das heisst, ich muss auf Hardware Serial umstellen, denke ich mal.


Gesendet von iPad mit Tapatalk Pro
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

Ich habe gerade von einem anderen Forenmitglied eine Nachricht bekommen: Man muss bei der serial bridge in ESPEasy die Logs komplett ausschalten. Sonst geht das nicht. Ich bin mir sicher, dass ich das nicht gemacht habe.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

stefanru

Hi,

ich habe gerade das selbe Problem.
Ich möchte einen 2ten Strohmzähler an einen ESP8266 hängen und brauche dazu SoftwareSerial.

Ich habe mir das Plugin mal angeschaut.
Es waren einige Änderungen nötig damit es unter MEGA läuft.
Außerdem wurde der große SoftwareSerial benutzt. Ich habe auf ESPSerial umgestellt.
Somit passt es auch wieder in den Flash.

Ich habe eine erste Version kompiliert. Habe aber noch keinen Sensor testen können.
Das Plugin funktioniert erstmal und ich werde bei Gelegenheit mal einen 2ten Sensor dranhängen.

Ich hänge meine Version hier mal ungetestet an falls jemand auch dringend danach sucht.

Gruß,
Stefan

stefanru

Hi,

ok die erste Version war noch falsch. Hat den Software Mode von ESPEasySerial nicht verwendet.

Hier nun die erste getestete Version. Funktioniert wunderbar für das Einlesen von Sensoren.
Ich habe einen Infrarot Lese LED, zum Einlesen des digitalen Stromzählers verwendet.
Mit dem Plugin kann ich nun alle beide Zähler im Haus mit einem ESP nach OBIS bringen.
Dazu verwende ich einen an RX/TX mit Hard Serial und einen an D6/D7 mit SoftSerial.

Habe das Coding überarbeitet, Logging auf Debug und Debug_Dev level eingeführt.
Damit könnt ihr sehen was passiert wenn etwas nicht gehen sollte.
Loglevel lässt sich im ESP unter Adavanced umstellen.

Gebaut habe ich gegen ESPEasy MEGA 30.11.2020 mit VCode und Platformio.

Hier der neue Header des Plugins:

/*
* This plug in is based on a plugin written by immi/amunra/chons
* Parts of the plugin are derived from _P149_MHZ19.ino
* numbering from https://github.com/letscontrolit/ESPEasyPluginPlayground (132 is not used,
* therefore changed from 130 to 132)
*
* The Code was changed on 12.12.2020 to use ESPSerial to reduce footprint in flash
* Logging was introduced with DEBUG and DEBUG_DEV level
* With Debug you see initialization and data flowing
* With Debug_Dev you see also connection from telnet or no connection
*
* This plugin enables a software serial port on ESP8266 to a WiFi network
* (similar to _P020_Ser2Net, but uses different pins and therefore softwareserial).
*
* devicepin1 - is RX for ESP8266
* devicepin2 - is TX for ESP8266
*
* version: 0.2 04/04/2018 PeMue
* version: 0.5 12/12/2020 Stefanru -> FHEM Forum
*/


Im Anhang das Plugin als INO und die heutige getestete Version für ESP8266 4M1M.

Gruß,
Stefan

andies

Ich habe mir ewig mit ESPSerial die Zähne ausgebissen. Kannst Du vielleicht ein klein wenig Doku beisteuern, das wäre super für all die, die (wie ich) daran verzweifeln. Vielleicht kann ich davon auch was in das Wiki schreiben.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

stefanru

#13
Hi Andies,

gerne. Was meinst du genau?
Der Code in der INO ist eigentlich selbsterklärend.
Die Haupt Änderung hier war:
// Use ESPeasySerial Software Option, port = 6 SW, Pin1, Pin2, inverse = false, buffer = 256, softwareserail = true
Plugin_132_SS = new ESPeasySerial(ESPEasySerialPort::software, Settings.TaskDevicePin1[event->TaskIndex], Settings.TaskDevicePin2[event->TaskIndex], false, 256, true); // from P149, added logic, buffer

Für MEGA musste auch addHTML anstelle von String verwendet werden usw.

Alles in allem aber überschaubar. Schau dir einfach mal die INO Datei an.
Habe wo ich es für nötig erachtet habe auch dokumentiert.

Wenn noch Fragen sind melde dich einfach nochmal.

Wiki ist ne tolle Idee. Welche Seite meinst du da?

Gruß,
Stefan


andies

Ich meine diese hier: https://wiki.fhem.de/wiki/ESPEasy

Wenn Du keinen Account hast und mir sagst, wo ungefähr was hinein soll, kann ich das gern übernehmen.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann