Vhih mit ESP32

Nachdem hier schon so viele tolle vhih-Projekte und auch ESP32-Projekte wie der M5Stack etc. vorgestellt worden sind, möchte ich euch auch mein aktuelles Projekt vorstellen.

Das Projekt ist noch in einem sehr frühen Stadium und kaum getestet, allerdings bin ich schon auf euren Input gespannt und auf die Ideen, was damit anzufangen ist.

Auch würden mich natürlich Bedenken bzw. „natürliche“ Grenzen interessieren.
Wie viele hih kann der homee? Ich weiß es nicht. Wie viele Nodes packt der ESP32? Weiß ich auch nicht.

Die Readme ist noch bei 0, die werde ich aber erweitern.

Aber jetzt erst mal: Worum geht es überhaupt.

Ich habe, ausgehend von den Projekten von @stfnhmplr (vhih im node-red) und @Micha (M5Stack) und natürlich allen daran Beteiligten, die Idee gehabt, Sensoren mit dem ESP32 zu entwickeln und natürlich ohne node-red oder sonstige Brücken in den homee zu bringen.

Dies ist mir zumindest in einem „Proof of Concept“ gelungen. Aktuell ist es noch keine einfach zu verwendende Library, aber ich bin in der Lage, zufällige Temperaturwerte und Schalterstellungen an den homee zu übertragen und zu empfangen.

Ich habe das Projekt mit PlatformIO in VS Code entwickelt. Dies wird wohl auch benötigt, wenn man meinen Versuch „nachspielen“ möchte.

Im Code müssen die Nodes und die Attribute initialisiert werden:

  node* n1 = new node(10, 3001, "Luftsensor"); //CANodeProfileTemperatureAndHumiditySensor
  na1 = n1->AddAttributes(new nodeAttributes(5)); //CAAttributeTypeTemperature
  na2 = n1->AddAttributes(new nodeAttributes(7)); //CAAttributeTypeRelativeHumidity

  na1->setUnit("%C2%B0C");
  na1->setMinimumValue(-20);
  na1->setMaximumValue(60);
  na2->setUnit("%25");
  

  node* n2 = new node(20, 10, "Schalter");
  schalterAttribute = n2->AddAttributes(new nodeAttributes(1));
  schalterAttribute->setEditable(1);
  schalterAttribute->setMinimumValue(0);
  schalterAttribute->setMaximumValue(1);
  schalterAttribute->setCallback([](nodeAttributes* a)
  {
    a->setCurrentValue(a->getTargetValue());
    vhih.updateAttribute(a);
  });

  vhih.addNode(n1);
  vhih.addNode(n2);

Wie man sieht, wird bei dem Schalter ein Callback registriert. Dieses wird gerufen, wenn der homee einen Wert an den ESP32 sendet. Anders herum muss updateAttribute gerufen werden, wenn ein Sensor am ESP32 einen Wert empfängt, welcher an den homee gesendet werden soll.

Für die IDs muss man sich an den enums von sthnhmplr https://github.com/stfnhmplr/homee-api/blob/master/lib/enums.js orientieren.

Ich habe das Projekt auf GitHub hochgeladen, falls es sich jemand anschauen möchte.

12 „Gefällt mir“

Du erstellst also auf jedem Esp ein vhih ?
Die Idee kam mir auch schon aber hatte ich nicht weiter verfolgt.

Sehr schön :+1:

Ja genau, so mache ich es ^^
Die Idee schlummert schon ewig, jetzt hab ich mich einfach mal dran gesetzt.

2 „Gefällt mir“

Finde ich cool, mit wie vielen hast du es schon probiert (esp gleichzeitig ).

Die Frage ist wie sich die Auslastung des homee durch die Verbindungen verändert ?

Kannst du das auch mal für die arduino ide formatieren ?

Hm, das mit der Arduino IDE wird wohl schwierig. Die habe ich auch bisher nicht so im Fokus gehabt, da die Entwicklung mit PlatformIO im VSCode „so viel besser“ ist.
Ich habe momentan noch einen separaten homee mit nur einem ESP32 dran.
Ich kann mir aber nicht vorstellen, dass die Menge der hih so schnell ein Problem wird. Die Menge der Nachrichten, welche vom ESP an den homee gesendet werden hält sich ja eng in Grenzen.

Edit: https://platformio.org/install/ide?install=vscode

1 „Gefällt mir“

Sehr cool!

Schau ich mir bei Gelegenheit an!
Danke fürs „mit uns teilen“ :slight_smile:

1 „Gefällt mir“

Sooo, ich habe es auch in der Arduino IDE „am laufen“.

Folgende Schritte:



Und natürlich aus meinem Github-Projekt
Jeweils als ZIP herunterladen.

Diese drei ZIP in das Verzeichnis libraries der Arduino IDE entpacken (Im Benutzerverzeichnis).
Dann muss noch über die Bibliotheksverwaltung ArduinoJson hinzugefügt werden (wenn nicht schon vorhanden).

Bildschirmfoto 2021-04-26 um 21.36.51

So sieht es dann aus (Crypto war glaub ich schon drin, keine Ahnung).

Dann ist dies hier der Inhalt der .ino-Datei:

#include <WiFi.h>
#include "virtualHomee.hpp"

const char* ssid = "Wlan";
const char* password = "Password";

virtualHomee vhih;

nodeAttributes* na1;
nodeAttributes* na2;

nodeAttributes* schalterAttribute;


void setup() {
  // put your setup code here, to run once:
  randomSeed(analogRead(0));

  Serial.begin(115200);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());


  node* n1 = new node(10, 3001, "Luftsensor"); //CANodeProfileTemperatureAndHumiditySensor
  na1 = n1->AddAttributes(new nodeAttributes(5)); //CAAttributeTypeTemperature
  na2 = n1->AddAttributes(new nodeAttributes(7)); //CAAttributeTypeRelativeHumidity

  na1->setUnit("%C2%B0C");
  na1->setMinimumValue(-20);
  na1->setMaximumValue(60);
  na2->setUnit("%25");
  

  node* n2 = new node(20, 10, "Schalter");
  schalterAttribute = n2->AddAttributes(new nodeAttributes(1));
  schalterAttribute->setEditable(1);
  schalterAttribute->setMinimumValue(0);
  schalterAttribute->setMaximumValue(1);
  schalterAttribute->setCallback([](nodeAttributes* a)
  {
    a->setCurrentValue(a->getTargetValue());
    vhih.updateAttribute(a);
  });

  vhih.addNode(n1);
  vhih.addNode(n2);

  vhih.start();

}

void loop() {
  // put your main code here, to run repeatedly:
  sleep(10);

  na1->setCurrentValue(random(-20, 60));
  vhih.updateAttribute(na1);
}

Dann kompiliert es…

3 „Gefällt mir“

Habe das ganze mal mit nen Wemos D1 Mini 32 getestet und bin echt begeistert über diese super Arbeit.
Habe sowohl die Sensorik als auch Aktorik getestet und beides funzt super.

Jetzt muss ich mir mal nen paar Möglichkeiten für den Einsatz einfallen lassen.

Beregnung , Girasensortaster und was noch so kommen kann.

Danke @danil @stfnhmplr @Tobias

:slight_smile::star_struck:

4 „Gefällt mir“

Tja grosse Klasse was ihr zusammen da erbringt! Super, dass Ihr es hier teilt.

Danke !

1 „Gefällt mir“

Was bedeuten denn die beiden Zahlen (10, 3001) und (20,10) in den Zeilen:

node* n1 = new node(10, 3001, "Luftsensor");

und

node* n2 = new node(20, 10, "Schalter");

Die erste Zahl ist die einmalige node ID und die zweite Zahl ist die Profil ID.
Die Profil Id findest du in dem Code der Webapp oder auf github.

Das heißt dann, ich kann die beliebig wählen?
Mit der Bedingung, das sie nicht mehrmals vorkommen dürfen?

Die node Id kannst du frei wählen. Profile sind vorgeschrieben.

Wo finde ich denn eine Liste dieser Profile mit ihren Nummern?

Hier zum Beispiel…

Hallo, hier ist jetzt meine Umsetzung des von @danil entwickelten vhih, basierend auf einem ESP32. Ich habe das Ganze so erweitert, dass mehrere ESP’s über ESP-Now die Werte an einen einzelnen ESP senden bzw. Befehle empfangen. Der einzelne ESP übernimmt jetzt die Verbindung zum homee. Das hat den Hintergrund, dass es nur einen vhih geben muss und nicht jeder Sensor/Aktor-ESP ein eigener vhih ist. Damit das ganze chic aussieht, habe ich den Haupt-ESP (ein ESP32 D1 Mini) mit einem 1,3" OLED zur Statusanzeige ausgestattet, in einen Würfel gepackt (wurde mir zur Verfügung gestellt) und das Ganze oben auf den homee-Turm gepackt. So sieht das aus;



Die Statusanzeige für die WLAN-Verbindung benötigt man, da in den Sensor ESP’s die MAC-Adresse und der WLAN-Kanal eingestellt werden muss. Sonst „finden“ die sich nicht. Die Statusanzeige wird bei jedem empfangen Paket aktualisiert. Benötigt man nicht unbedingt, bietet aber auf der anderen Seite eine gewisse Überwachungsmöglichkeit ohne sich über USB Statusmeldungen abholen zu müssen.

19 „Gefällt mir“

Gehst du damit in Serie? :smiling_face_with_three_hearts:

Für den ESP mit Display kein Problem. Den Würfel habe ich nur bekommen. Da müsste jemand das 3D-Modell erstellen. Ich habe auch selber gar keinen Drucker. :wink:

Noch eine Ergänzung zum ESP-Now. Dadurch, dass die ESP’s direkt kommunizieren wird das WLAN nicht belastet.

Dein Lieferant (wir wissen beide wer es ist) ziert sich immer noch die Druckdaten bereitzustellen? Frag ihn noch mal ob er ihn nicht doch inkl. der Aussparrungen für die USB-Magneten auf einer der 3D-Druckplattformen bereitstellen will. Dann fehlt nur die Bezugsquelle für die USB-Magneten…

Würde weitere Hacks durch andere erleichtern.

1 „Gefällt mir“