Vhih mit ESP32

Esp32 S3 Zero

Kein Stress :innocent:, ich komm vmtl. vor Donnerstag nichtmehr an den Rechner.

1 „Gefällt mir“

Hättest du einen älteren esp dann entfallen diese Anpassungen. :crazy_face:
Der S3 hat 2 CPU und irgendwie passt da was nicht.

:sweat_smile: Du meinst jetzt das in, AsyncWebSocket.cpp und WebAuthentication.cpp
oder wegen der Namensgebung für die Attribute

Ja genau du sagst es . Die Änderungen an derLib meine ich.

Ich hatte das selbe Problem und habe es dadurch gelöst, indem ich die Eigenschaft „name“ in den Public-Bereich der Klasse verschoben habe. Nun kann ich den Namen setzen, bevor ich das neue Attribut dem node hinzufüge. Ob’s so korrekt ist weiß ich nicht aber es funktioniert :wink:
Bei Gelegenheit werde ich meinen Forq auch bei github hochladen. … aber ich hätte auch nichts gegen ein offizielles Update :slight_smile:

2 „Gefällt mir“

Aktuell bin ich dabei immer größere werdende Projekte auf dem ESP32 anzugehen und setze dabei auch auf die virtualHomee.hpp von GitHub - DanielKnoop/homee-api-esp32: homee-api-esp32 ist eine Library, um ESP32 und ESP8266 Microcontroller über die "vhih"-Funktion direkt mit der Smarthome-Zentrale homee zu verbinden..

Entstanden sind bereits

  1. Heizungsdatenlogger. Hier werden diverse Temperaturen der Heizung aufgezeichnet
  2. Eine Fußbodenheizungssteuerung mit Abfrage eines Raumthermometers via Bluetooth und die Ansteuerung einer Umwälzpumpe
  3. (in Arbeit) eine Steuerzentrage für meine Garage mit Taupunktlüftung, Wasserstandsüberwachtung einer Zisterne, Garagentorüberwachung und Bodenfeuchtemessung.

Leider habe ich mit der homee-Anbindung ein Problem und vielleicht kann mir hier ja jemand auf die Sprünge helfen.
Wenn ich ein neues Gerät, also einen neuen Node anlege, muss ich mich für ein bestimmtes Profil entscheiden. Je nachdem für was ich mich da entscheide, verhalten sie die hinzugefügten Attribute später in der homee-App anders: werden angezeigt (oder nicht); können über die App editiert werden oder sind reine Anzeigen bzw. nur über Gerät-Bearbeiten erreichbar, werden unter „Gerätestatus“ oder unter „Messwerte“ angezeigt, etc. pp.
Ich habe es auch schon geschafft über eine falsche Anzahl / Typ von Attributen meinen Homee so abzuschießen, dass ich ein Backup einspielen musste.
Was ich trotz langer Suche nicht geschafft habe: einen simplen ein/aus-Schalter oder (noch besser) einen Taster und zusätzliche Messwerte darstellen zu können. Im Besten Fall habe ich einen Schieberegler angezeigt bekommen.

Nun meine Frage an die Experten hier:
a) Gibt es irgendwo eine Übersicht, welche Profile welche Attribute voraussetzen und wie das Gerät dann in der App dargestellt wird?
b) gibt es vielleicht so eine Art „neutralen node“, dem man einfach beliebige Attribute mit geben kann und die dann auch „einfach funktionieren“ :wink: ?
c) es gibt in der noteattributs.hpp noch ein paar weitere Methoden, deren Wirken sich mir nicht erschließt - z.B. „setData(String _data)“ oder „setState“ / „getState“. Ich hatte damit ein wenig gespielt aber passiert ist nichts erkennbares.
Gibt es irgendwo eine Doku für die einzelnen Methoden?

So sieht aktuell die Oberfläche für meine Taupunktlüftung aus. Für die Modus-Umschaltung wollte ich eigentlich einen Taster und keinen Schieberegler. Temperaturen laden unter Messwerte aber Taupunkt im Gerätestatus. Alle anderen Kombinationsversuche gingen gar nicht oder waren zumindest nicht besser. Außerdem würde ich dem node gerne das Ventilatoricon zuordnen - leider ist das für dieses Profil nicht verfügbar.

Auszug aus meinem Code:

//homee definitionen
#define CAAttributeTypeButtonState 40
#define CAAttributeTypeDewPoint 235
#define CAAttributeTypeTemperature 5
#define CAAttributeTypeRelativeHumidity 7
#define CAAttributeTypeTargetTemperature 6

#define CANodeProfileRoomThermostatWithHumiditySensor 3004

#define HMID_MODE 1
#define HMID_FAN_STATE 2
#define HMID_DEWPT_DIFF 3
#define HMID_IN_TEMP 4
#define HMID_OUT_TEMP 5
#define HMID_IN_HUM 6
#define HMID_OUT_HUM 7
#define HMID_IN_DEWPT 8
#define HMID_OUT_DEWPT 9


void homee_setup()
{
  node *n1;
  nodeAttributes *na;
  
  //Neues Gerät
  n1 = new node(vhih_ID, CANodeProfileRoomThermostatWithHumiditySensor, "Taupunktlüftung");  //2009 - CANodeProfileWindowHandleWithButtonsAndTemperatureAndHumiditySensor
  
    //FAN-Status (an / aus)
  na = new nodeAttributes(CAAttributeTypeTargetTemperature, HMID_MODE); 
  na->name = "Betriebsmodus";
  na->setUnit("");  
  na->setMinimumValue(0);
  na->setMaximumValue(1); 
  na->setCurrentValue(0);
  na->setEditable(true);
  na->setCallback(callBack_homeeReceiveValue);
  n1->AddAttributes(na);       //set attribute to node

    //FAN-Status (an / aus)
  na = new nodeAttributes(CAAttributeTypeButtonState, HMID_FAN_STATE); 
  na->name = "Lüfterstatus";
  na->setUnit("");  
  na->setMinimumValue(0);
  na->setMaximumValue(1); 
  na->setCurrentValue(0);
  na->setCallback(nullptr);
  na->setEditable(false);
  n1->AddAttributes(na);       //set attribute to node

  na = new nodeAttributes(CAAttributeTypeDewPoint, HMID_DEWPT_DIFF);
  na->name = "Taupunktdifferenz";
  na->setUnit("K");  
  na->setMinimumValue(-100);
  na->setMaximumValue(100);
  na->setCurrentValue(0);
  na->setCallback(nullptr);
  na->setEditable(false);
  n1->AddAttributes(na);       //set attribute to node

  na = new nodeAttributes(CAAttributeTypeTemperature, HMID_IN_TEMP); //temperatur
  na->name = "Temperatur innen";
  na->setUnit("°C");
  na->setMinimumValue(0);
  na->setMaximumValue(1); 
  na->setCurrentValue(0);
  na->setCallback(nullptr);
  na->setEditable(false);
  n1->AddAttributes(na);       //set attribute to node

  na = new nodeAttributes(CAAttributeTypeTemperature, HMID_OUT_TEMP); 
  na->name = "Temperatur außen";
  na->setUnit("°C");
  na->setMinimumValue(0);
  na->setMaximumValue(1); 
  na->setCurrentValue(0);
  na->setCallback(nullptr);
  na->setEditable(false);
  n1->AddAttributes(na);       //set attribute to node

  na = new nodeAttributes(CAAttributeTypeRelativeHumidity, HMID_IN_HUM); 
  na->name = "Luftfeuchte innen";
  na->setUnit("%");
  na->setMinimumValue(0);
  na->setMaximumValue(1); 
  na->setCurrentValue(0);
  na->setCallback(nullptr);
  na->setEditable(false);
  n1->AddAttributes(na);       //set attribute to node

  na = new nodeAttributes(CAAttributeTypeRelativeHumidity, HMID_OUT_HUM);
  na->name = "Luftfeuchte außen";
  na->setUnit("%");
  na->setMinimumValue(0);
  na->setMaximumValue(1); 
  na->setCurrentValue(0);
  na->setCallback(nullptr);
  na->setEditable(false);
  n1->AddAttributes(na);       //set attribute to node

  na = new nodeAttributes(CAAttributeTypeDewPoint, HMID_IN_DEWPT);
  na->name = "Taupunkt innen";
  na->setUnit("°C");
  na->setMinimumValue(0);
  na->setMaximumValue(1); 
  na->setCurrentValue(0);
  na->setCallback(nullptr);
  na->setEditable(false);
  n1->AddAttributes(na);       //set attribute to node

  na = new nodeAttributes(CAAttributeTypeDewPoint, HMID_OUT_DEWPT); 
  na->name = "Taupunkt außen";
  na->setUnit("°C");
  na->setMinimumValue(0);
  na->setMaximumValue(1); 
  na->setCurrentValue(0);
  na->setCallback(nullptr);
  na->setEditable(false);
  n1->AddAttributes(na);       //set attribute to node


  //Gerät hinzufügen
  virtHomee->addNode(n1);

Mit Setdata wird das Data Objekt gefüllt meistens ein String. Dazu muss im Unit text stehen damit dieses dann angezeigt wird.
Setstate ist für den Zustand des Nodes verantwortlich. Der Zustand des Nodes ist z.B. nicht erreichbar , wird abgefragt oder auch vom Host gelöscht.

In deinem Fall glaube ich wirst du den State nicht brauchen.
Das Editable ist eigentlich ein numerischer Wert entweder 0 oder 1 es sei denn du hast da was geändert.

In den Enums stehen die Bedeutungen der State drin.

Am besten orientierst du dich ein wenig an Orginalen Geräten wie die sich verhalten und welche Attribute diese besitzen.

Solltest du in einem Gerät zweimal den gleichen Attributtype verwenden musst du noch die Instanzen hochzählen beginnend mit 0 . Ansonsten kommt es zu Fehlern bei homee.

Hallo @Micha, danke für Deine Antworten.

Du hast recht - setEditable ist ein uint8 - das habe ich falsch gemacht. Konnte nach Korrektur keinen Unterschied feststellen was zu erwarten war.

In den Enums stehen die Bedeutungen der State drin.
Welche enums meinst Du?
Diese hier?:

 CAAttributeType: {
    CAAttributeTypeNone: 0,
    CAAttributeTypeOnOff: 1,                        
    CAAttributeTypeDimmingLevel: 2,
    CAAttributeTypeCurrentEnergyUse: 3,
    CAAttributeTypeAccumulatedEnergyUse: 4,
    CAAttributeTypeTemperature: 5,
    CAAttributeTypeTargetTemperature: 6,
    CAAttributeTypeRelativeHumidity: 7,
    CAAttributeTypeBatteryLevel: 8,
    CAAttributeTypeStatusLED: 9,               
    CAAttributeTypeWindowPosition: 10,
    ...

Mit diesen Werten arbeite ich, aber ob und wie dann ein entsprechendes Element in der App dargestellt wird, hängt eben auch am verwendeten Profil. Mit Thermometern hat das ja noch ganz gut geklappt aber alles andere funktioniert nicht wie erwartet und gewünscht (Stichtwort Schalter / Taster)

Ok … ich habe mit 1 begonnen. Geändert auf 0 scheint es aber keine sichtbare Auswirkung zu haben. Wie ist das, wenn ich mehrere Geräte (nodes) habe? Starte ich dann bei jedem Node wieder bei 0? Das macht es ein klein wenig aufwändiger die Rückgabewerte vom Homee zuzuordnen.

Gutes Stichwort: Wo bekomme ich denn diese Info her - welche Geräte es gibt und welche Profile und Attribute jeweils verwendet werden?

Danke Dir nochmals!

Hier ein Link zu einer älteren enums.

Alternativ die ist etwas vollständiger aber ob die jetzt komplett ist weiß ich nicht.

http://homee-tool.de/enums.js

Danke Dir, diese Datei habe ich - die Version muss ich noch abgleichen aber die Standard-Geräte sind ja identisch.
Leider stellt sich für mich weiter die Frage, welches NodeProfil welche Attribute voraussetzt und wie diese dann in der Homee-App dargestellt werden. Das ein oder andere kann man sich ja zusammenreimen aber vieles eben auch nicht - gerade, wenn die Geräte exotischer oder komplexer werden.

Nur mal als ein schnelles Beispiel:
Ich habe gerade ein Gerät mit CANodeProfileOnOffSwitch + CAAttributeTypeOnOff erstellt
→ funktioniert wie gewünscht. Ich habe einen einfachen Schalter realisiert! :slight_smile:

Nun hätte ich gerne ein Thermometer mit einem Schalter (z.B. um per Remote die Display-Beleuchtung zu aktivieren):
CANodeProfileBinaryInputWithTemperatureSensor + CAAttributeTypeOnOff + CAAttributeTypeTemperature
In der App bekomme ich aber nur einen Schieberegler für die Temperatur angezeigt. Erst unter Gerät->Bearbeiten wird dann der Schalter als Konfigurationselement aufgeführt.

Verwendete ich aber anstatt CAAttributeTypeOnOff CAAttributeTypeBinaryInput, so sehe ich in der App plötzlich zwei Schieberegler - was ja für den Binär-Eingang erstmal nicht logisch erscheint.

Also wie bekomme ich es hin, dass neben dem Thermometer/Schieberegler ein Binäres Element (Schalter) erscheint.

Wie schon gesagt, dass ist nur ein Beispiel. Es soll verdeutlichen, dass sich die Suche nach der korrekten Kombination beliebig langwirrig gestalten kann.
Wenn’s hier eine Doku gäbe, wäre das ech 'ne feine Sache!

{"id":22,"name":"Garten","profile":15,"image":"nodeicon_dimmablebulb","favorite":0,"order":35,"protocol":1,"routing":0,"state":1,"state_changed":1735213937,"added":1448723369,"history":1,"cube_type":1,"note":"","services":7,"phonetic_name":"testwilly","owner":0,"security":0,"attributes":[{"id":106,"node_id":22,"instance":0,"minimum":0,"maximum":100,"current_value":0,"target_value":0,"last_value":0,"unit":"%25","step_value":1,"editable":1,"type":2,"state":1,"last_changed":1737375544,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"","name":"","options":{"automations":["step"]}},{"id":107,"node_id":22,"instance":0,"minimum":0,"maximum":1,"current_value":0,"target_value":0,"last_value":0,"unit":"","step_value":1,"editable":1,"type":1,"state":1,"last_changed":1737375543,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"","name":"","options":{"can_observe":[300],"automations":["toggle"],"history":{"day":35,"week":5,"month":1,"stepped":true}}},{"id":108,"node_id":22,"instance":0,"minimum":0,"maximum":1,"current_value":0,"target_value":0,"last_value":0,"unit":"","step_value":1,"editable":1,"type":63,"state":1,"last_changed":1657367695,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"","name":""},{"id":375,"node_id":22,"instance":0,"minimum":0,"maximum":65000,"current_value":0,"target_value":0,"last_value":0,"unit":"Lux","step_value":1,"editable":0,"type":11,"state":1,"last_changed":1473103665,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"","name":"","options":{"history":{"day":1,"week":26,"month":6}}},{"id":525,"node_id":22,"instance":0,"minimum":0,"maximum":100,"current_value":0,"target_value":0,"last_value":0,"unit":"","step_value":1,"editable":0,"type":0,"state":1,"last_changed":1475485110,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"","name":""},{"id":610,"node_id":22,"instance":0,"minimum":0,"maximum":0,"current_value":0,"target_value":0,"last_value":0,"unit":"text","step_value":1,"editable":0,"type":44,"state":1,"last_changed":1657367280,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"3.52","name":""},{"id":611,"node_id":22,"instance":0,"minimum":0,"maximum":0,"current_value":0,"target_value":0,"last_value":0,"unit":"text","step_value":1,"editable":0,"type":45,"state":1,"last_changed":1657367280,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"2.02","name":""},{"id":3219,"node_id":22,"instance":0,"minimum":0,"maximum":1,"current_value":0,"target_value":0,"last_value":0,"unit":"","step_value":1,"editable":1,"type":309,"state":1,"last_changed":1657367696,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"","name":""},{"id":4181,"node_id":22,"instance":0,"minimum":0,"maximum":1,"current_value":1,"target_value":1,"last_value":0,"unit":"","step_value":1,"editable":1,"type":385,"state":1,"last_changed":0,"changed_by":0,"changed_by_id":0,"based_on":0,"data":"","name":""}]}

Das ist ein vollständiges Profil eine Fibaro Up Dimmer mit all seinen Attributen. Und genauso musst du dann auch mit deinen Geräten vorgehen. homee hat ein ein Paar Änderungen an den Attributen scheinbar vorgenommen so das die Version der ESP Lib nicht ganz aktuell ist.

hi micha - jetzt warst Du etwas schneller mit Deiner Antwort als ich mit meiner Überarbeitung.
Vielleicht ist das ja der entscheidende Link der mir fehlt: Wo finde ich denn diese Profil-Definitionen für alle Geräte?

Das hier ist ein Enocean HK Thermostat

{"id":1458,"name":"Keller%20Hobby%20Heizk%C3%B6rper","profile":3006,"image":"nodeicon_radiator","favorite":0,"order":70,"protocol":3,"routing":0,"state":1,"state_changed":1737282862,"added":1645881233,"history":1,"cube_type":3,"note":"%23%20AFRISO%20AVD%2020-D","services":7,"phonetic_name":"","owner":58,"security":0,"attributes":[{"id":3935,"node_id":1458,"instance":0,"minimum":0,"maximum":4,"current_value":1,"target_value":1,"last_value":0,"unit":"n%2Fa","step_value":1,"editable":0,"type":33,"state":1,"last_changed":1737393366,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"","name":""},{"id":3936,"node_id":1458,"instance":0,"minimum":0,"maximum":1,"current_value":0,"target_value":0,"last_value":0,"unit":"n%2Fa","step_value":1,"editable":0,"type":69,"state":1,"last_changed":1645881234,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"","name":"","options":{"automations":["reset"],"history":{"day":182,"week":26,"month":6,"stepped":true}}},{"id":3937,"node_id":1458,"instance":0,"minimum":10,"maximum":30,"current_value":17.215,"target_value":17.215,"last_value":17.215,"unit":"%C2%B0C","step_value":0.1,"editable":0,"type":5,"state":1,"last_changed":1737393366,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"","name":"","options":{"history":{"day":1,"week":26,"month":6}}},{"id":3938,"node_id":1458,"instance":0,"minimum":10,"maximum":30,"current_value":17.5,"target_value":17.5,"last_value":17.5,"unit":"%C2%B0C","step_value":0.1,"editable":1,"type":6,"state":1,"last_changed":1737393366,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"","name":"","options":{"can_observe":[6],"automations":["step"],"history":{"day":35,"week":5,"month":1,"stepped":true}}},{"id":3939,"node_id":1458,"instance":0,"minimum":0,"maximum":1,"current_value":0,"target_value":0,"last_value":0,"unit":"n%2Fa","step_value":1,"editable":0,"type":70,"state":1,"last_changed":1737393366,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"53","name":"","options":{"automations":["reset"],"history":{"day":182,"week":26,"month":6,"stepped":true}}},{"id":3940,"node_id":1458,"instance":0,"minimum":0,"maximum":100,"current_value":1,"target_value":1,"last_value":1,"unit":"%25","step_value":1,"editable":0,"type":18,"state":1,"last_changed":1737393366,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"","name":"","options":{"history":{"day":1,"week":26,"month":6}}},{"id":3941,"node_id":1458,"instance":0,"minimum":0,"maximum":1,"current_value":0,"target_value":0,"last_value":0,"unit":"n%2Fa","step_value":1,"editable":1,"type":91,"state":1,"last_changed":1737393366,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"","name":""},{"id":3942,"node_id":1458,"instance":0,"minimum":5,"maximum":20,"current_value":10,"target_value":10,"last_value":10,"unit":"min","step_value":5,"editable":1,"type":29,"state":1,"last_changed":1737393366,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"","name":""},{"id":3943,"node_id":1458,"instance":0,"minimum":0,"maximum":270,"current_value":270,"target_value":270,"last_value":270,"unit":"%C2%B0","step_value":90,"editable":1,"type":90,"state":1,"last_changed":1737393366,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"","name":""},{"id":3944,"node_id":1458,"instance":0,"minimum":20,"maximum":80,"current_value":20,"target_value":20,"last_value":20,"unit":"%C2%B0C","step_value":1,"editable":0,"type":89,"state":1,"last_changed":1737393366,"changed_by":1,"changed_by_id":0,"based_on":1,"data":"","name":"","options":{"history":{"day":1,"week":26,"month":6}}},{"id":4291,"node_id":1458,"instance":0,"minimum":0,"maximum":1,"current_value":1,"target_value":1,"last_value":0,"unit":"","step_value":1,"editable":1,"type":385,"state":1,"last_changed":0,"changed_by":0,"changed_by_id":0,"based_on":0,"data":"","name":""}]}

Ich kann ja mal ein Heatit Thermostat mit Display anlernen und die Daten ziehen.

Probiere mal bitte diese Profile
CANodeProfileRoomThermostat: 3003,
CANodeProfileRoomThermostatWithHumiditySensor: 3004,

Hi Micha,

ich habe das Profil 3006 „Keller-Hobby-Heizkörper“ in meinen C-Code übertragen. Es macht etwas und es sieht soweit sinnvoll aus. Spaßeshalber habe ich ein weiteres Attribut vom Typ 1 (CAAttributeTypeOnOff) hinzugefügt. Der neue Schalter erschien tatsächlich, aber unter „Gerät bearbeiten“ und nicht wie erhofft über/unter dem Schieberegler für die Temperatur, wo ihn jeder bedienen kann.
Gleiche Attribute aber mit Profil 3004 hatte zur Folge, dass einige der bisherigen Messwerte nun unter Gerätestatus angezeigt wurden.
Profil 3003 brachte auch keine neuen Erkenntnisse.

Aktuell bleibt es leider bei meinen vielen Fragezeichen:
Woher weiß ich, welches Attribut bei welchem Node-Profile benötigt wird oder nur optional ist und wo / wie es am Ende in der App dargestellt wird.
Auch wenn ich ein paar konkrete Vorstellungen für meine Anwendung habe, wäre es mir lieber, ich würde das generelle System hinter den Profilen und Attributen verstehen bzw. eine entsprechende Doku finden.

Das generelle System hinter den Profilen kannst du nur aus dem Code der App entnehmen wie diese dargestellt werden.
Sicherlich könnte auch homee dazu Auskunft geben aber leider wird das wohl nicht geschehen.