ESP 8266 + Arudino Pro Mini + Firmata, HowTo Setup

Begonnen von breezybadger, 22 Januar 2015, 21:20:39

Vorheriges Thema - Nächstes Thema

breezybadger

Hallo liebe FHEM Gemeinde,

da ich bei meiner bisherigen Suche leider kein Ergebnis gefunden habe hoffe ich hier auf Hilfe.
Ich würde gerne mein Arduino Pro Mini mit ESP 8266 in FHEM einbinden. Leider habe ich bisher keine Möglichkeit gefunden wie ich die Pins des Arduino in der Kombination ansteuern kann. Toll wäre ähnlich wie im aktuellen Modul den Status der Pins des Arduino abfragen zu können und diese Werte dann in FHEM zu verarbeiten.

Das was meiner bisherigen Suche am nächsten gekommen ist, ist das Firmata FHEM Modul. Leider ist dort der günstige ESP 8266 noch nicht implementiert. Was bisher schon klappt ist einzelne Anfragen über den ESP an einen Host zu schicken. Leider weiß ich nicht wie ich diese in FHEM verarbeiten könnte.
Da ich die Sensoren und den Arduino Pro Mini gerne per Batterie betreiben würde, und das WLAN Modul recht Stromfressend ist strebe ich eine Lösung an , in der das Modul kurz aufwacht die Sensoren ihre Werte schicken und wieder schlafen gehen.

Jemand Hinweise die mich auf meiner Suche unterstützen?

Danke schon mal für die Hilfe

Liebe Grüße Daniel

Ralf W.

Hallo,

Du bist einige Wochen zu früh. Ich beschäftige mich auch mit dem Thema, habe es aber aus Zeitmangel verschoben. Ich versuche mit Arduino Nano, ESP8266 und WS2812B-Strip eine Statusanzeige zu bauen. Und wenn ich dann anfange, wird es bestimmt etwas dauern. Hatte gestern zu ersten Mal einen Arduino in der Hand.

Die Idee ist auf dem ESP8266 den Webserver zu starten, Daten mittels FHEM system-Kommando zu übergeben, der Nano wertet aus und schaltet die WS. Später dann auch der umgekehrte Weg, um an FHEM state zu senden.

Vielleicht hilft Dir das für den Weg FHEM > Arduino: http://www.forum-raspberrypi.de/Thread-uart-esp8266-raspberrypi?pid=122103#pid122103
Ist zwar für einen RasPi, sollte aber ähnlich auf dem Arduino funktionieren.

Über Strom sparen habe ich mir keine Gedanken gemacht. Durch den LED-Einsatz wird die Anzeige über ein Netzteil versorgt.

MfG
Proxmox Nipogi AM16, FHEM:RaspberryMatic:DE ConBee II, diverse Sensoren und Aktoren.

strauch

Vielleicht wäre ein panstamp eine gute Alternative. Ist vor allem Stromsparend.

Gesendet von meinem Nexus 4 mit Tapatalk

FHEM 5.6 VMware mit Debian. 1 CUL für FS20 und HMLAN für Homematic, HM-CC-RT-DN, HM-LC_Sw1PBU-FM, HM-LC-Bl1PBU-FM,  HM-SEC-SC, HM-SEC-SC-2, HM-LC-Sw1-Pl2, HM-Sec-RHS, ASH2200, FHT80B, S20KSE, Sonos, XBMC, FB_Callmonitor, SMLUSB, Arduino Firmata, uvm.

breezybadger

Erstmal Danke fürs Antworten. Zum Thema Panstamp, den hatte ich auch zuerst im Blick heißt aber wieder erneut ein Stick am Server.

@Ralf W. Das wäre natürlich toll, was ich gerade nicht verstehe, ist das wenn mal angenommen das Firmata Protokoll liefe - würdest du dir den Umweg um den Webserver sparen können und per PWM direkt aus FHEM die Pins für die WS2802 ansteuern können. Wenn du dort den PowerDown Modus ausstellst, auch Bidirektional. Sonst korrigiere mich gerne, ich lerne noch.

Ralf W.

@breezybadger

Ich kenne aktuell Firmata noch nicht. Kann Dir deshalb dazu keine Antwort geben. Sehe ich mir an. Aber wie geschrieben, kann noch dauern.

Mir ist in dem Zusammenhang noch eine Seite eingefallen: http://www.cse.dmu.ac.uk/~sexton/ESP8266/

MfG
Proxmox Nipogi AM16, FHEM:RaspberryMatic:DE ConBee II, diverse Sensoren und Aktoren.

CaptainHook

#5
Hi, 
Schau dir das mal an https://github.com/n800sau/ESP8266-transparent-bridge.
Damit hatte ich schon erfolgreich meinen Firmata-Arduino mit Fhem verbinden.  Dazu musst du im define einfach als Schnittstelle deine ip und den port angeben bei dem oberen Quellcode ist es Port 23.
Wenn alles verkabelt und verbunden ist musst du übers webinterface set firmata reinit bzw set firmsta reset versuchen. Danach war mein Arduino erfolgreich verbunden. Allerdings nicht lange.  Die Verbindung ist nicht sonderlich stabil.

Ich bastele derzeit an einer firmata Version die über den esp8266 einen udp Server bereit stellt.  (Ein weiterer esp8266 wird gerade zum HomeMatic Status Display,  der läuft stabil. Allerdings schicke ich dem direkt die anzuzeigenden Farbe Werte als udp-datagram. Dafür spare ich den arduino ein)
Allerdings habe ich noch keine Idee wie ich fhem beibringen kann die firmata Befehle per udp zu versenden.

Gruß,
Stephan

Gesendet von meinem Galaxy Tab 4 LTE mit Tapatalk
Lenovo M53 ThinkCentre 10DC | Docker | SolarEdge SE10K + SE5000H + Energy Bank 10KWh | EspEasy | Tasmota | Hue | Alexa | uvm.

Ralf W.

#6
@CaptainHook

Auf Anhieb fällt mir zu UDP folgenden des ein:
echo -n "hello" >/dev/udp/IP-des-esp8266/Port-des-esp8266


Hast Du nähere Infos zu Deinem Statusdisplay?

MfG

Gesendet von meinem Lenovo B6000-H mit Tapatalk

Proxmox Nipogi AM16, FHEM:RaspberryMatic:DE ConBee II, diverse Sensoren und Aktoren.

CaptainHook

#7
Hi,

Das Senden von UDP Paketen ist weniger mein Problem ;).
Ich habe versucht die Firmata implementierung von FHEM zu verstehen (/opt/fhem/FHEM/lib/Device/Firmata.pm o.ä.)
Dort gibt es bisher 2 Funktionen ..listen und open soweit so gut. Nun würde ich jetzt ferm gerne beibringen das er die Firmata befehle nicht auf die Serial-Schnittstelle schreibt sonder als UDP an mein ESP8266 sendet. Leider habe ich derzeit nur wenig Zeit und nutzte diese Aktionen eher als Entspannung um abzuschalten ....

Wenn auch etwas OffTopic zum StatusDisplay:
Ich nutze ne modifizierte Version Variante von diese Software https://github.com/gmorell/ws2812esp8266.

Und meiner 99_myUtils.pm habe ich das Senden beigebracht. Ist alles noch in einem sehr frühen Stadium aber es funktioniert.
Die Funktion Wird über ein "at" alle 60Sekunden ausgeführt...


###### ESP8266 SendStates ######
use Try::Tiny;
use IO::Socket::INET;

#SendStateToESP8266 ("10.0.0.106","7777")
sub SendStateToESP8266
{
my ($socket,$data, $ip, $port);
my (@Windows);

$ip   = shift;
$port = shift;

$data = "0000AA";

@Windows = ("RHS_Arbeitszimmer",
            "RHS_Balkon",
            "RHS_Kueche",
            "RHS_Schlafzimmer_L",
            "RHS_Schlafzimmer_R",
            "SC_Eingang");


#  We call IO::Socket::INET->new() to create the UDP Socket
# and bind with the PeerAddr.
  try
  {
    $socket = new IO::Socket::INET (
    PeerAddr   => "$ip:$port",
    Proto      => "udp"
    ) or die "ERROR in Socket Creation : $!\n";

    foreach my $Window (@Windows)
    {
      $data .= WindowsStateToColor ($Window);
    }

   $data .= "0000AA";
   
    #data perperation
    $data =~ s/ //g;
    $data = pack('H*', $data);
   
    #send operation
    $socket->send($data);
    sleep(1);
    $socket->close();

    Log 1, "SendStateToESP8266 success!";
  }
  catch
  {
    Log 1, "SendStateToESP8266 IO::Socket::INET returned:  $_";
  };
}
###############################
use Switch;

sub WindowsStateToColor
{
my($Device, $Value, $Return);
#Color definiition in GBR for WS2112b strip
#rrggbb
#cd3232 red
#0c8703 green 
#c7ad05 yellow
my($Open, $Tilted, $Close, $Undef) = ("32cd32","adc705","870c03", "c9c9c9");

$Device = shift;

$Value = ReadingsVal($Device,"state","undef");

Log 1, "Value $Device of is $Value";

switch (lc $Value)
{
  case "open"   { $Return = $Open;   }
  case "closed" { $Return = $Close;  }
  case "tilted" { $Return = $Tilted; }
  else          { $Return = $Undef;  }
}

return $Return;
}
###############################


€dit: Vergest was ich gestern geschrieben habe. zum Thema firmata. Es könnte einfacher sein als geglaubt.
Wenn ein Firmata-Device als Netzwerk definiert wird öffnet FHEM einen TCP Port und wartet bis sich ein Netzwerk-Arduino-FIRMATA verbindet.
Das versuche ich jetzt mit einem ESP8266 zu realisieren. Arduino->Esp(TCP Connection to FHEM)->FHEM.... soweit der Plan
Lenovo M53 ThinkCentre 10DC | Docker | SolarEdge SE10K + SE5000H + Energy Bank 10KWh | EspEasy | Tasmota | Hue | Alexa | uvm.

breezybadger

Klasse, Danke für den Input.

@CaptainHook, habe ich das richtig verstanden: Wenn du mit deinem Projekt fertig bist, lässt sich das FHEM Modul(http://www.fhemwiki.de/wiki/Arduino_Firmata) wie beschrieben nutzen?

Ich dachte es sei mit relativ wenig Aufwand verbunden die vorhanden Firmata Software so zu modifizieren, dass es anstelle eines Ethernet einfach den ESP anspricht. Da lag ich wohl falsch, aber genau daran arbeitest du gerade oder?

Es ist noch so viel für mich zu lernen, danke fürs Helfen.

CaptainHook

#9
Hi,

genau das ist der Plan. Ich wollte die ConfigurableFirmata anpassen....
mal seh'n wie weit ich heute abend/nacht komme.
Der ESP soll dabei mit der "Standard" AT-Firmware laufen. Der Arduino macht den Rest.

Grüße
Stephan
Lenovo M53 ThinkCentre 10DC | Docker | SolarEdge SE10K + SE5000H + Energy Bank 10KWh | EspEasy | Tasmota | Hue | Alexa | uvm.

breezybadger

Das ist genau was ich suche. Ich bin sehr gespannt!

CaptainHook

Hi,

Zwischenstand:

für heute gebe ich auf!!!! Das Teil mach mich verrückt....
Ein Testprogram funktioniert soweit gut,
Wenn ich dann alles in Conf-firmata rein flickel .. läuft mal GARNICHTS :'(

Als Grundlage für die ESP8266 implemtierung dient das hier https://github.com/INEXTH/Arduino-ESP8266_libs
Allerdings ist wenn ich alles soweit drin hab der Speicher auch schon übervoll!! Ergo man muss einiges weglassen.

Ergo zurück auf Anfang..neuer Plan:
Der ESP8266 verbindet sich selbstandig und gibt die Befehle an den Arduino weiter
[Ganz so wie es die transparent Bridge machen sollte, aber der ESP baut die Verbindung auf statt nur ein Socket bereit zu stellen ... ]
Vorteil, keine Quellcode auf dem Arduino ergo kann die Conf-Firmata Vollständig drauf... mal sehn was der Tag so bringt

Grüße
Stephan

Lenovo M53 ThinkCentre 10DC | Docker | SolarEdge SE10K + SE5000H + Energy Bank 10KWh | EspEasy | Tasmota | Hue | Alexa | uvm.

breezybadger

Hallo Stephan,

das klingt doch nach einen sehr guten Fortschritt. Ich habe soviel Projekte die damit so einfach werden würden.
Auch hier kommt wieder meine Unwissenheit aber wäre folgender Weg nicht möglich ( und Platzsparend)
Du schaust dir an, welche Befehle FHEM sendet und "erwartet" und baust die aus den Firmata Protokoll nach für den ESP? Dann kannst du die Implementierung von Ethernet usw komplett entfernen.

Ist nur eine Idee, aber du wirkst schon sehr so, dass du weißt was du tust. Ich freue mich wenn du mich auf dem laufenden hälst.

Beste Grüße  Daniel

CaptainHook

#13
Hi,

Nummer 5 lebt !!!!! Ich hab es soweit geschafft! Im Anhand ist die Software für den ESP8266 >> Quick'n'Dirty - schön war aus! <<
Wie es funktioniert.
Der ESP baut eine TCP verbindung auf zu FHEM. DEr ESP ist mit einem "normalen" FIRMATA-Arduino verbunden über RX und TX.
Alle Befehle von FHEM werden über die UART an den Arduino weitergeleitet und umgekehrt.

HowTo Build:
Meine ToolChain bassiert auf folgenden Wiki https://github.com/esp8266/esp8266-wiki/wiki
Das MakeFile im tar-Archiv sollte 100% kompatibel sein.
WLAN Einstellungen Server-IP und Port wird in user/user_config.h konfiguert.
dann reich ein make und ein make flash und der ESP ist auch schon fertig

Dann wird das Ganze verkabelt
VCC 3,3V
RST&CH_PD gehen auf 3,3V
RX --> TX-Arduino (ggf über LevelShifter da der ESP nicht 5V kompatibel ist!!!!!)
TX --> RX-Arduino (ggf über LevelShifter da der ESP nicht 5V kompatibel ist!!!!!)
GND GND
GPIO0 bleib in der Luft hängen.
GPIO2 gibt einen 0.5Sec puls aus  diese kann eine LED zum blinken bringen (+ ---RRR----|<----GPIO2) den nutze ich um zu sehen das der ESP noch lebt.

Die 3,3V Spannungs versorgung sollte vernünftig sein die 3,3V der Arduino (vom FDTI-Chip sind NICHT ausreichend)
Ich nutze daher einen 3.3V LDO (AMS1117-3.3) um mir aus den 5V eine ordentliche 3,3V Versorgung zu machen.
Im Bild kommen die 5V von einem PC-Netzteil, dieses versorgt den Arduino und den ESP.

Alles ohne Gewähr!

Viele Grüße,

Stephan

(Weiter zum "Nicht Homematic"-StatusDisplay)

Edit: Jetzt auch Hier: https://github.com/CaptainRoot/ESP8266_Transparent_TCP_Client_Bridge
Lenovo M53 ThinkCentre 10DC | Docker | SolarEdge SE10K + SE5000H + Energy Bank 10KWh | EspEasy | Tasmota | Hue | Alexa | uvm.

breezybadger

Ganz großes Kino!!!! So genial, vielen Dank! Ich teste es Morgen