Arduino FHEM Library

Begonnen von kingmathers, 04 Dezember 2018, 20:10:04

Vorheriges Thema - Nächstes Thema

kingmathers

Hallo,

ich weiß nicht ganz, ob das hier das richtige Forum ist, aber da ich keins Forum speziell für Arduino gefunden habe, poste ich es mal hier:

Im Rahmen meiner Arbeit am ESP8266 WiFi Color Display habe ich für Arduino eine Library geschrieben, die die Kommunikation mit einem FHEM Server ermöglicht. Ich verwende dazu einen HTTPClient. Die Library ist bereits verfügbar:

Arduino: FHEM (Kann in Arduino IDE über Tools, Manage Libraries..., Suche nach "FHEM" installiert werden)
GitHub: FHEM_Arduino

Die Library kann benutzt werden, um Daten von FHEM zu empfangen und an FHEM zu senden. Es wird Basic Auth (Benutzername und Passwort) sowie CSRF unterstützt.

Nach der Installation muss die Library eingebunden werden:
#include FHEM.h

Anschließend muss eine Instanz definiert werden:

FHEM fhemclient("http://192.168.1.1:8083/fhem", "User", "Password");
FHEM fhemclient("http://192.168.1.1:8083/fhem");

Wenn man Basic Auth nicht verwendet, kann man die beiden Argumente weglassen und nur den Server angeben. Der Server muss in dem genannten Format (mit port und /fhem) angegeben werden.

Daten können dann folgendermaßen geladen bzw. gesendet werden:

String result = fhemclient.LoadFromServer("{SomeSub()}"); //SomeSub() aus 99_myUtils wird ausgeführt, Rückgabewert in result gespeichert
fhemclient.LoadFromServer("set Licht on"); //FHEM Befehl "set Licht on" wird ausgeführt.


Der Code in 99_myUtils.pm sieht bei mir z.B. so aus:


sub SomeSub
{
  my $response = Value("WaschmaschineDummy");
  $response = "Waschmaschine\nStatus: " . $response;
  return $response;
}


Um die Anmeldung mit Basic Auth und das CSRF Token kümmert sich die Library selbstständig.

Vielleicht hat ja sonst noch jemand Verwendung dafür. Mir war diese Weise (über HTTPClient) lieber als über MQTT mit PubSubClient, da ich damit kaum vertraut bin im Gegensatz zu HTTPClient und die direkte Verwendung von FHEM Befehlen und Funktionen möglich ist.

Grüße,
Philipp
Raspberry Pi B+, FS20, 1-Wire, HM
FHEM Home Control (App für Windows 10): https://forum.fhem.de/index.php/topic,49891.0.html
FHEM Arduino Library: https://forum.fhem.de/index.php/topic,94093.0.html

MadMax-FHEM

Hi Philipp,

vielen Dank für die Mühe(n)!

Wenn ich Zeit hab (Weihnachten ist ja bald :)  ) werde ich's mal testen.

Danke, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

PeMue

... ich lese auch mal mit.

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

Esjay

#3
Guten Morgen zusammen,
ich weiß das Thema ist schon etwas älter, jedoch stehe ich gerade im Rahmen eines anderen Projektes https://repalmakershop.com/pages/mower-build-information vor der Herausforderung Daten aus fhem an einen Arduino zu senden, bzw. zu empfangen.

ESPEasy, Firmata etc. halte ich nicht für den richtigen Ansatz, da bereits ein Sketch auf einem NodeMCu besteht, welcher die Daten verarbeitet.
Ich würde mich nun gerne irgendwie 

Nun habe ich diesen Ansatz gefunden, jedoch gibt es schon ein "gap" zwischen dem ersten Post und der Git Seite.

Ich würde mal behaupten, dass das Git die Referenz ist, daher habe ich folgendes versucht.

#include <FHEM.h>

FHEM _fhem("http://192.168.178.10:8083/fhem"); //if you do not use Basic Auth

void loop(){

String result = _fhem.LoadFromServer("{SomeSub()}"); //executes SomeSub() in 99_myUtils and saves the return value in result
_fhem.LoadFromServer("set Licht on");

}


Da passiert aber mal überhaupt nichts, bzw. wird der Sketch nicht mal richtig kompeliert.

Ich bin gerade dabei mich in das Ganze Thema Arduino einzuarbeiten, wollte aber nichts unversucht lassen, hier evtl. durch den richtigen Ansatz eine Abkürzen nehmen zu können.

Falls jemand andere Ansätze hat, wäre ich dankbar für einen Hinweis.

Solange werde ich es weiter versuchen, und vll hat ja hier jemand einen Tipp, oder setzt die Arduino Fhem Libary erfolgreich ein.


Grüße

Esjay

Kurzes Update:

Habe die Verbindung hin bekommen!

Habe einfach nur den Aufruf der Funktion vergessen. ;D

Danke Philipp für die Reaktion  ;)

kingmathers

Sehr schön dass es doch klappt!

Der Unterschied zwischen dem Forum und GitHub bezieht sich nur auf den Namen der Instanz, der mit folgender Zeile festgelegt wird:

FHEM fhemclient("http://192.168.1.1:8083/fhem");

In diesem Beispiel "fhemclient", bei GitHub heißt er "_fhem". Der Name kann frei gewählt werden, nur muss natürlich im Verlauf der entsprechende Name auch weiterhin verwendet werden.

Bei weiteren Fragen gerne melden :)

Grüße,
Philipp
Raspberry Pi B+, FS20, 1-Wire, HM
FHEM Home Control (App für Windows 10): https://forum.fhem.de/index.php/topic,49891.0.html
FHEM Arduino Library: https://forum.fhem.de/index.php/topic,94093.0.html

Esjay

Ahhh perfekt, danke für die Erklärung.

Hast du eventuell noch ein Beispiel, bei dem ich anstatt des "on" Befehls eine Variable übergeben kann?

Grüße

kingmathers

Müsste so gehen:

String command = "set Licht on";
_fhem.LoadFromServer(command);


command kann dann beliebig angepasst werden, wenn der Wert in der Variable newstate gespeichert ist z.B. so:

String command = "set Licht " + newstate;
Raspberry Pi B+, FS20, 1-Wire, HM
FHEM Home Control (App für Windows 10): https://forum.fhem.de/index.php/topic,49891.0.html
FHEM Arduino Library: https://forum.fhem.de/index.php/topic,94093.0.html

Esjay

Danke dir!

Dann werde ich mir mal die Sketche meines Projektes genauer anschauen, und schauen, wie ich das alles in einen Pott bekomme.

Schönen Abend noch.

Grüße

Esjay

Guten Abend Philipp,

ich habe ein Problem, welches ich mir nicht wirklich erklären kann.

Mir ist es nicht möglich, folgendes Im Sketch zu tun:

String Test=test;
String result;

result = _fhem.LoadFromServer("{MowerControl()}");

if (result == Test) {
Mach irgendwas ;
}


Sub

sub MowerControl(){

my $response = ("test");
return $response;

}


Scheinbar sendet die Funktion noch irgendetwas mit, was ich so nicht sehe, oder _fhem.LoadFromServer packt da irgendetwas rein, was da zumindest für mein Vorhaben nicht hingehört.

Hast du eine Idee?

Gruß Stephan

kingmathers

Evtl so:

String Test="test";

Also mit "test" statt test, klappt das?
Raspberry Pi B+, FS20, 1-Wire, HM
FHEM Home Control (App für Windows 10): https://forum.fhem.de/index.php/topic,49891.0.html
FHEM Arduino Library: https://forum.fhem.de/index.php/topic,94093.0.html

Esjay

Leider auch nicht

Habe den Sketch jetzt mal so erweitert:

void FHEMTX()
{

TXFhemVoltage="setreading 3dMower batteryVoltage ";
TXFhemVoltage+=BatteryVoltage;

TXFhemCurrent="setreading 3dMower current ";
TXFhemCurrent+="not available";


_fhem.LoadFromServer(TXFhemVoltage);
_fhem.LoadFromServer(TXFhemCurrent);


String Test="test";

result = _fhem.LoadFromServer("{MowerControl()}"); // Sub ist gleich geblieben!
Serial.print(Test);
Serial.print(result);


if (result==Test){
Serial.print("Hallo");
}


Der Serial Monitor wirft mir für beides test aus, jedoch wird die Bedingung nicht war.

Setzte ich zusätzlich String Test2 = "test"; und vergleiche diese, sprich ohne _fhem.LoadFromServer("{MowerControl()}"); funktioniert die Abfrage.

Grüße

kingmathers

#12
Da bin ich jetzt auch unsicher, aber versuch mal in der Sub die Klammern wegzulassen:

my $response = "test";
return $response;}


Kommen die beiden anderen Befehle denn an bei FHEM? Die Kommunikation an sich scheint ja zu funktionieren, nur beim Vergleichen der zwei Variablen hackt es irgendwo oder?

Grüße,
Philipp

EDIT:

Ansonsten probier mal folgendes:

if (result.equals(Test))
oder
if (result == "test")

Eigentlich sollte dein Code zwar auch laufen, aber vielleicht kann man so den Fehler eingrenzen.
Raspberry Pi B+, FS20, 1-Wire, HM
FHEM Home Control (App für Windows 10): https://forum.fhem.de/index.php/topic,49891.0.html
FHEM Arduino Library: https://forum.fhem.de/index.php/topic,94093.0.html

Esjay

#13
Jap, die anderen beiden Befehle werden an Fhem gesendet. Kommunikation steht!

Auch das weglassen der Klammern in der Sub hilft leider nicht!


if (result.equals(Test)) Funktioniert ebenfalls nicht

if (result == "test") Funktioniert ebenfalls nicht

kingmathers

Bei dem Code fehlt eine geschweifte Klammer am Ende (falls der Code vollständig kopiert wurde), eine zum Abschluss der if-clause und einmal zum Abschluss der void FHEMTX():

void FHEMTX()
{

TXFhemVoltage="setreading 3dMower batteryVoltage ";
TXFhemVoltage+=BatteryVoltage;

TXFhemCurrent="setreading 3dMower current ";
TXFhemCurrent+="not available";


_fhem.LoadFromServer(TXFhemVoltage);
_fhem.LoadFromServer(TXFhemCurrent);


String Test="test";

result = _fhem.LoadFromServer("{MowerControl()}"); // Sub ist gleich geblieben!
Serial.print(Test);
Serial.print(result);


if (result==Test){
Serial.print("Hallo");
}


Ansonsten probier doch nur zum testen mal folgendes aus:

String Test="test";

result = _fhem.LoadFromServer("{MowerControl()}"); // Sub ist gleich geblieben!
Serial.print(Test);
Serial.print(result);

result = "test";

if (result == Test){
Serial.print("Hallo");
}


Außerdem könnte man sich mal die Länge der Strings anschauen:

result = _fhem.LoadFromServer("{MowerControl()}"); // Sub ist gleich geblieben!
Serial.print(Test);
Serial.print(result);


Serial.print(Test.length());
Serial.print(result.length());


Vielleicht ist irgendwo ein Zeilenumbruch oder so reingerutscht den man auf den ersten Blick nicht sieht?

Grüße,
Philipp
Raspberry Pi B+, FS20, 1-Wire, HM
FHEM Home Control (App für Windows 10): https://forum.fhem.de/index.php/topic,49891.0.html
FHEM Arduino Library: https://forum.fhem.de/index.php/topic,94093.0.html