Arduino mit eigenem Programm an Fhem

Begonnen von mcbain2k, 19 Mai 2013, 11:41:59

Vorheriges Thema - Nächstes Thema

mcbain2k

Hallo
ist es möglich einen Arduino z.B. mit Firmata an fhem zu kopplen im Arduino noch ein Programm laufen zu lassen und einzelne Variablen

mit fhem zu lesen bzw. zu schreiben?

Danke schonmal.

MFG

 McBain

PeterS

Hallo

Ich hatte das Ganze wie folgt für eine Füllstandsüberachung realisiert.
Fhem pingt den AVR jede Minute an und erhält als Parameter einen String-Wert im Format: Messwert~Prozent~Inhalt~Zeit

Dieser String-Wert wird auf auf die einzelnen Dummy-Devices aufgesplittet :-)

Gruss Peter


Fhem-Code:
#-------------------------------------------------------------
# Standmessung via Ultraschall
define Messwert dummy
attr Messwert group Standmessung
attr Messwert room Alles
define Prozent dummy
attr Prozent group Standmessung
attr Prozent room Alles
define Inhalt dummy
attr Inhalt group Standmessung
attr Inhalt room Alles
define Uhrzeit dummy
attr Uhrzeit group Standmessung
attr Uhrzeit room Alles

define At_GetData_AVR at +*00:01:00 {\
my ($import);;\
$import = GetHttpFile('192.1XX.XXX.XX', '/?GetData');;\
my @value = split("~", $import);;\
fhem "set Messwert $value[0]";;\
fhem "set Prozent $value[1]";;\
fhem "set Inhalt $value[2]";;\
fhem "set Uhrzeit $value[3]";;\
}

mcbain2k

Danke Peter

Genau so etwas hab ich gesucht, hab den Ultraschallsensor auch hier noch liegen :-)

Könnete ich Deinen passenden Arduino-Scetch auch bekommen?

Geht das auch über USB oder nur über Arduino mit Ethernetshild?

Für Tasterauswertung ist 1 Minute natürlich zu langsam. Muss man wahrscheinlich einen zusätzlichen Arduino mit Firmata betreiben.
Oder lässt sich dein Scetch irgendwie in die Firmata einbinden?

Gruesse
 McBain

Carsten

Hallo,

ich verwende zur Ansteuerung meines Arduinos über USB ( seriell ) ECMD. Funktioniert ziemlich gut. Zum Verständnis der .classdef-Dateien war der Wiki-Eintrag zum AVR-NET-IO ganz hilfreich.

est

Hallo,

ich gehe derzeit in die andere Richtung. Der Arduino ist der aktive Part. Er baut eine Verbindung zu FHEM über telnet auf und schickt dort ganz normale set <DEVICE> <Value> Befehle hin. Ist natürlich nicht ganz so schnell wie Firmata weil es mehr Bytes je Befehl übertragen muß. Aber ich kann leider kein Perl und die allgemeinen "analog Value Devices" für FRM sind ja so weit ich weiß noch nicht fertig.

Ich bin noch stark in der Entwicklung. Den aktuellen Stand findest Du aber hier: https://github.com/eddyst/SH

Viele Grüße
FHEM unter Ubuntu Server aus ESXi 5
1 HM-LAN, 3 HM-CC-RT-DN, 3 HM-CC-TC, 4 HM-CC-VD
1 Arduino verbindet die Vitodens + oneWire + sonstigen Heizungskram über Ethernet mit dem telnet-Port von FHEM

PeterS

Hallo McBain

Hier ein Auszug aus meinem Arduino-Programm:

Gruss Peter

---------------------------------------------

/* Auszug Datenübertragung AVR-FHEM
Datenabfrage der AVR-Daten via URL: 192.1XX.XXX.XX/?GetData
Übertragung von Messwert~Prozent~Inhalt~Zeit
*/

// Includes
#include <Time.h>
#include <SPI.h>
#include <Ethernet.h>

// Declarations
byte mac[] = {  
  0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 };
byte ip[] = {  
  192, XXX, XXX, XX };

EthernetServer server = EthernetServer(80); //port 80

void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.println(Ethernet.localIP());
// ...
  }

void loop() {
// ...
  checkForClient();
// ...

void checkForClient(){
  EthernetClient client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    boolean sentHeader = false;
    while (client.connected()) {
      if (client.available()) {
        if(!sentHeader){
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          sentHeader = true;
        }
        char c = client.read();
        if(reading && c == ' ') reading = false;
        if(c == '?') reading = true; //found the ?, begin reading the info
        if(reading){
          if (input){
            parameter = parameter + c;
          }
          else
          {
            input = true;
          }
        }
      }
    }
    Serial.println(parameter);
    if (parameter=="GetData"){
      //      sline = "<Title>";
      sline = "";
      sline += distance;
      sline += " cm";
      sline += "~";
      sline += dtostrf(percent, 3,0, line);
      sline += " %";
      sline += "~";
      sline += dtostrf(percent*ctank/100, 3,0, line);
      sline += " l";
      sline += "~";
      if (day() < 10)
        sline += "0";
      sline += day();
      sline += ".";
      if (month() < 10)
        sline += "0";
      sline += month();
      sline += ".";
      sline += year();
      sline += " ";
      if (hour() < 10)
        sline += "0";
      sline += hour();
      sline += ":";
      if (minute() < 10)
        sline += "0";
      sline += minute();
      sline += ":";
      if (second() < 10)
        sline += "0";
      sline += second();
      //      sline += "</Title>";
      client.println(sline);
      Serial.println(sline);
    }
    delay(1); // give the web browser time to receive the data
    client.stop(); // close the connection:
  }
}