48_HomeConnect.pm neue Überarbeitung

Begonnen von Adimarantis, 24 Dezember 2024, 00:02:52

Vorheriges Thema - Nächstes Thema

Adimarantis

Ok "value=0 seconds" erledigt.
Ich hatte anfangs die "geniale" Idee die units rauszuwerfen, was sich als Fehler herausgestellt hat. Die Stelle hab ich wohl übersehen.

Hab den Flow nochmal geändert, so dass er "getProgramOptions" jetzt beim Wechsel in den "run" State aufruft (sofern das klappt). Beim "activeProgram" Event wars ja zu früh. Eventuell gab es da auch eine Race Condition die den Wechsel in "DelayedStart" bei meinem Test verschluckt hat.

Ich muss mir das mit den Callbacks im HomeConnectConnection Modul mal ansehen - besteht die Möglichkeit, dass Callbacks "verschwinden" wenn es Überschneidungen von Requests gibt?

Jetzt aber erstmal das schöne Wetter (zumindest hier ist es endlich mal sonnig) geniessen....
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Prof. Dr. Peter Henning

Zitat von: Adimarantis am 27 Dezember 2024, 13:28:03Ich muss mir das mit den Callbacks im HomeConnectConnection Modul mal ansehen - besteht die Möglichkeit, dass Callbacks "verschwinden" wenn es Überschneidungen von Requests gibt?
Kann sein. Bei der OWX-Modulserie habe ich deshalb eine ziemlich komplizierte interne Queue eingebaut - neue Requests werden in eine solche eingestellt, so lange die Antwort auf den vorherigen Request noch nicht da ist.

Die Abläufe habe ich beim HomeConnect aber über Zeitverzögerungen in DOIFS gelöst. Abgesehen davon, dass das Nachfolgende derzeit nicht funktioniert (wegen der nicht mehr vorhandenen tr_States), hat das Timing damit ganz gut geklappt:
defmod Waschen.N DOIF ## 1. Setze Phase \
([WAV28G43:".*tr_State1.*"] & [Waschen:active] !~ /wait/)\
({fhem("setreading Waschen phase ".ReadingsVal("WAV28G43","tr_State1",""))},\
 {fhem90Cmd("setreading Waschen phase ".ReadingsVal("WAV28G43","tr_State1",""))})\
## 2. Finished\
DOELSEIF\
([WAV28G43:".*Finished.*"] and [07:00-22:30])\
({speak("TText 238386743",":131:")},\
 {speak("TText 355532121",":131:")},\
 {speak('Tab1.EG',":131:")},\
 setreading Waschen event Finished)\
## 3. - 5. Auswahl Programm, Setzen Verzögerung, Start \
DOELSEIF\
( [Waschen:".*RelativeTime.*"] and [Waschen:active] ne "start" and [WAV28G43:state] =~ /Ready/ )\
 ( setreading Waschen event $EVENT,\
   set WAV28G43 SelectedProgram Cotton,\
  {Log 1,"=======> Selecting Cotton on WAV28G43"})\
 ({fhem("set WAV28G43 Temperature GC".ReadingsVal("Waschen","Temperature","30"))})\
 (set WAV28G43 DelayRelative {(my @evt = split(/ /,ReadingsVal("Waschen","event",""));;;;Log 1,"=======> Setting WAV28G43 to relative delay $evt[1]";;;;return $evt[1])} )\
 (set WAV28G43 StartProgram,\
  {Log 1,"=======> Delayed start WAV28G43"},\
  setreading Waschen event DelayedStart,\
  setreading Waschen active no)\
DOELSEIF\
( [Waschen:".*EndTime.*"] and [Waschen:active] ne "start" and [WAV28G43:state] =~ /Ready/ )\
 (setreading Waschen event $EVENT,\
  set WAV28G43 SelectedProgram Cotton,\
  {Log 1,"=======> Selecting Cotton on WAV28G43"})\
 ({fhem("set WAV28G43 Temperature GC".ReadingsVal("Waschen","Temperature","30"))})\
 (set WAV28G43 DelayEndTime {(my @evt = split(/ /,ReadingsVal("Waschen","event",""));;;;Log 1,"=======> Setting WAV28G43 to endtime delay $evt[1]";;;;return $evt[1])} )\
 (set WAV28G43 StartProgram,\
  {Log 1,"=======> Delayed start WAV28G43"},\
  setreading Waschen event DelayedStart,\
  setreading Waschen active no)\
DOELSEIF\
( [Waschen:".*StartTime.*"] and [Waschen:active] ne "start" and [WAV28G43:state] =~ /Ready/ )\
 (setreading Waschen event $EVENT,\
  set WAV28G43 SelectedProgram Cotton,\
  {Log 1,"=======> Selecting Cotton on WAV28G43"})\
 ({fhem("set WAV28G43 Temperature GC".ReadingsVal("Waschen","Temperature","30"))})\
 (set WAV28G43 DelayStartTime {(my @evt = split(/ /,ReadingsVal("Waschen","event",""));;;;Log 1,"=======> Setting WAV28G43 to starttime delay $evt[1]";;;;return $evt[1])} )\
 (set WAV28G43 StartProgram,\
  {Log 1,"=======> Delayed start WAV28G43"},\
  setreading Waschen event DelayedStart,\
  setreading Waschen active no)\

attr Waschen.N cmdpause 10:60:60:60
attr Waschen.N do always
attr Waschen.N group Waschen
attr Waschen.N repeatsame 1,1,1,1,1
attr Waschen.N room Kontrollraum
attr Waschen.N sortby 0
attr Waschen.N stateFormat {ReadingsVal("Waschen","event","")." ==> ".ReadingsVal($name,"state","")." ; ; ;".ReadingsTimestamp($name,"state","")}
attr Waschen.N wait 0:0:0,5,10,5:0,5,10,5:0,5,10,5

LG

pah

ZitatJetzt aber erstmal das schöne Wetter (zumindest hier ist es endlich mal sonnig) geniessen....
Genau deshalb waren wir gestern eine Runde auf dem Golfplatz. Heute ist es zu kalt dafür.

Adimarantis

So heute ist an der Donau mal wieder Nebel, also weiter geht's

Ich denke die Race Condition war darin begründet, dass ich während dem Auswerten von Events das getProgramOptions drin hatte, was evtl. noch nicht ausgelesende Events verschluckt hat. Jetzt wo es erst nach Erreichen des "run" State aufgerufen wird scheint es zu klappen.
Zumindest lief mein letzter Spülmaschinenlauf mit
1. Program manuell auswählen
2. RemoteStart manuell aktivieren
3. Maschine schliessen
4. Delay auf 1 Minute setzen
5. set startProgram
wie erwartet nach 1 Minute los und hat den Delay in state1/2 auch korrekt mit "Start um" + "HH:MM" eingezeigt.
Danach war die Option SilenceOnDemand ohne weiteres zutun vorhanden

Für meinen Flow scheint die Spülmaschine jetzt wie erwartet zu funktionieren (weitere Test werden zeigen ob das zuverlässig so ist). Falls bei dir was nicht geht, wäre hilfreich das Logfile mitzuprotokollieren.

Das HomeConnectConnection Modul scheint bereits eine Art queuing zu machen. Daran lag es wahrscheinlich nicht.

Ich habe jetzt die Logik, die "set" Befehle versteckt wenn diese nicht zutreffen wieder teilweise aktiviert. Hier auch bitte Feedback wenn es Fälle gibt, wo das nicht funktioniert.

Für "unsupported settings" habe ich jetzt mal testweise eine Idee implementiert:
Das Modul protokolliert mit, wenn die API "unsupported" zurückmeldet. In dem Fall wird die entsprechende Option in das Attribut "excludeSetting" geschrieben (Komma getrennte Liste). Sofern jetzt dann ein Setting auf diese Liste matched, wird es in der set Liste nicht angezeigt.
Um das zu implementieren musste ich auch eine kleine Änderung im 48_HomeConnectConnection.pm vornehmen, da der Callback sonst nicht weiss, welches Setting die Fehlermeldung verursacht hat.
Warum Attribut? Damit der Anwender die Liste selbst pflegen kann.
z.B. würde SilenceOnDemand in der Liste landen, wenn man versucht das zu setzen, obwohl die Maschine noch gar nicht läuft - dann kann man es zumindest einfach wieder rauslöschen - oder eben manuell Settings hinzufügen, die man sowieso nie braucht (bei mir z.B. ChildLock) um die set Liste klein zu halten.

Jörg






Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Adimarantis

Noch ein kleines Update:

Hab jetzt verstanden warum bei mir FinishInRelative seltsame Werte liefert:
Mein Device setzt NUR EstimatedTotalProgramTime und FinishInRelative enthält "irgendwas".
Ich hoffe folgende Änderung funktionieren generisch:
-Update von EstimatedTotalProgramTime als Event, setzt FinishInRelative auf 0
-Wenn EstimatedTotalProgramTime gesetzt ist, hat es Priorität vor FinishInRelative
-Außerdem setze ich StartAtHHMM auch im "finish" Fall, damit der Status "Start um HH:MM" in beiden Fällen funktioniert

Mein Trockner hat zumindest mit DelayRelative 0:1 jetzt brav nach einer Minute losgelegt.

Da das Gerät leer war, hat er die Laufzeit natürlich dann recht schnell auf 1 Minute reduziert.

Dann geht es für mich jetzt in den Langzeittest - alles was ich brauche scheint zu funktionieren.


Offene Punkte:

Geht diese Alarmfunktion eigentlich noch? Mir wäre jetzt nicht bewusst, dass ich den Code angefasst hätte, aber Seiteneffekte sind natürlich nicht ausgeschlossen

Wozu war der Test auf "60 seconds"?
 ($operationState =~ /Delayed/ && $startInRelative =~ /^60 seconds/) )
Das hatte ich entfernt aber soweit kein Problem feststellen können

Meine Waschmaschine hab ich mir noch überhaupt nicht angesehen.
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Prof. Dr. Peter Henning

Die Kurzzeitwecker (Aka "Alarm") funktionierten bis gestern wie gehabt.


Bei der Waschmaschine sollte (hat zumindest bis zu meiner Version) das Ausschalten funktioniert. Jetzt gibt es eine Fehlermeldung

Key BSH.Common.Setting.PowerState has unknown enum type or enum member BSH.Common.EnumType.PowerState.Off.

Beim Reading SpinSpeed werden die Anführungszeichen mit angezeigt RPM1400"

Bei den Programmen wird mir eines als "Super153045.Super1530" angeboten.

Ich werde morgen mal mehr damit probieren.

LG

pah

Adimarantis

PowerState:
Ich habe das selbe Problem mit meiner Waschmaschine, während es mit meinem Trockner funktioniert.
Bist du sicher, dass es vorher ging? Ich finde nämlich keinen Unterschied im Code. Laut API ist BSH.Common.EnumType.PowerState.Off ein absolut valider Wert. Alternativ unterstützen manche Maschinen wohl "Standby" aber da kommt die Fehlermeldung "Out of Bounds".
Ich habe jetzt ziemlich viele Variationen probiert und bekomme meine Maschine nicht ausgeschaltet.

Ich habe schon befürchtet, das Programm mit "." drin Probleme machen könnten.
Im Prinzip ist es aber richtig dass es so angeboten wird - denn so heisst es ja auch. Es gibt auch noch "Cotton.CottonEco"
Was wäre die Erwartung? Nur das Wort nach dem Punkt anzeigen? Wird nur etwas tricky, weil man das für "set SelectedProgram" wieder rückführen müsste, denn z.B. "set SelectedProgram CottonEco" versteht er nicht.

Die Anführungszeichen beim SpinSpeed habe ich nicht. Da wäre jetzt das Logfile hilfreich.

Ich habe gerade festgestellt, dass ich immer noch Probleme mit der DelayedStart Logik habe - irgendwie verschwindet bei mir jetzt die Option "StartInRelative", womit er sich weigert einen DelayedStart einzustellen. Hab heute abend aber nicht mehr rausgefunden was da passiert.

In meinen DOIF habe ich auch das Problem, dass ich waits zwischen Select und Start einbauen muss.
Mein Gedanke:
Hidden option (nur per Programm, nicht bei GUI):
set Delay HH:MM start
Mit dem zusätzlichen "start" Parameter setzt das Modul intern ein Flag, dass es nach erfolgreichem erreichen des DelayedStart Zustand automatisch das Programm startet. Vorteile:
1. Nur im Erfolg gestartet wird (ich hatte beim Testen schon versehentliche Sofortstarts, weil eben das Delay nicht angenommen wurde)
2. Verzögerung ist minmiert
3. Logik zuverlässig durch internes Flag (man könnte das mit DOIF auch simulieren, aber da gibt es einiges zu beachten)
4. Vereinfachung der Automatisierung

Morgen mehr....
Jörg
 
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Prof. Dr. Peter Henning

#21
ZitatBist du sicher, dass es vorher ging?
Ja.

Betreffend die Programme: Ich habe

Super153045.Super1530 
Cotton.Eco4060
DownDuvet.Duvet

LG

pah

Edit: Finde gerade bei der Spülmaschine noch einen Log-Eintrag:
2024.12.29 10:49:09 1: readingsUpdate(SN55ZS49CE,state,Offline) missed to call readingsBeginUpdate first.
2024.12.29 10:49:09 1: stacktrace:
2024.12.29 10:49:09 1:     main::readingsBulkUpdate            called by /opt/fhem/FHEM/48_HomeConnect.pm (2630)
2024.12.29 10:49:09 1:     main::HomeConnect_ReadEventChannel  called by /opt/fhem/FHEM/48_HomeConnect.pm (1509)
2024.12.29 10:49:09 1:     main::HomeConnect_Timer             called by fhem.pl (3511)
2024.12.29 10:49:09 1:     main::HandleTimeout                 called by fhem.pl (710)

EditEdit:
Hier muss auch noch etwas geschehen. Alle 15 Sekunden gibt es jetzt einen checkState der Spülmaschine, der aber mehrfach pro Sekunde wiederholt wird und das Log zumüllt:
2024.12.29 10:29:09 1: [HomeConnect_checkState] from s:idle d:Open o:Inactive
2024.12.29 10:29:09 1: [HomeConnect_checkState] to s:idle d:Open 1:Tür offen 2:-
2024.12.29 10:29:09 1: [HomeConnect_checkState] from s:idle d:Open o:Inactive
2024.12.29 10:29:09 1: [HomeConnect_checkState] to s:idle d:Open 1:Tür offen 2:-
2024.12.29 10:29:09 1: [HomeConnect_checkState] from s:idle d:Open o:Inactive
2024.12.29 10:29:09 1: [HomeConnect_checkState] to s:idle d:Open 1:Tür offen 2:-
2024.12.29 10:29:09 1: [HomeConnect_checkState] from s:idle d:Open o:Inactive
2024.12.29 10:29:09 1: [HomeConnect_checkState] to s:idle d:Open 1:Tür offen 2:-
2024.12.29 10:36:24 1: [HomeConnect_checkState] from s:idle d:Open o:Inactive
2024.12.29 10:36:24 1: [HomeConnect_checkState] to s:idle d:Open 1:Tür offen 2:-
2024.12.29 10:36:24 1: [HomeConnect_checkState] from s:idle d:Open o:Inactive
2024.12.29 10:36:24 1: [HomeConnect_checkState] to s:idle d:Open 1:Tür offen 2:-

Adimarantis

Bei meiner Maschine geht Power OFF auch mit deiner Version nicht:
2024.12.29 10:50:35.359 3: [HomeConnect] WM14VL40: set command: PowerOff
2024.12.29 10:50:35.360 1: [HomeConnect_PowerState] WM14VL40: setting PowerState->Off while OperationState=Ready and PowerState=
2024.12.29 10:50:35.360 4: WM14VL40: request /api/homeappliances/SIEMENS-WM14VL40-68A40E37DBDA/settings/BSH.Common.Setting.PowerState
2024.12.29 10:50:35.361 4: WM14VL40: no token refresh needed
2024.12.29 10:50:35.362 4: WM14VL40: requestAfterToken https://api.home-connect.com/api/homeappliances/XXXXXX/settings/BSH.Common.Setting.PowerState
2024.12.29 10:50:37.582 4: WM14VL40: response {
  "error": {
    "description": "Key BSH.Common.Setting.PowerState has unknown enum type or enum member BSH.Common.EnumType.PowerState.Off.",
    "key": "SDK.Error.InvalidSettingValue"
  }
}
2024.12.29 10:50:37.582 1: [HomeConnect_HandleError] WM14VL40: Error "Key BSH.Common.Setting.PowerState has unknown enum type or enum member BSH.Common.EnumType.PowerState.Off."
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Prof. Dr. Peter Henning

#23
Uff. Kann höchstens sein, dass die wieder mal etwas am API geändert haben, denn in der App kann ich die Kiste problemlos ausschalten.

ChildLock off geht jedenfalls mit
Zitat2024.12.29 13:25:58 1: [HomeConnect] WAV28G43: childlock with uri /api/homeappliances/BOSCH-WAV28G43-68A40E7146B5/settings/BSH.Common.Setting.ChildLock and
data {"data":{"key":"BSH.Common.Setting.ChildLock","value":false}}

Bei PowerState habe ich jetzt der Reihe nach probiert
Zitat2024.12.29 13:22:24 1: [HomeConnect] WAV28G43: PowerState with uri /api/homeappliances/BOSCH-WAV28G43-68A40E7146B5/settings/BSH.Common.Setting.PowerState and data
{"data":{"key":"BSH.Common.Setting.PowerState","value":<DATA>}}
<DATA> = \"BSH.Common.EnumType.PowerState.Off" => unknown enum type or enum member BSH.Common.EnumType.PowerState.Off
<DATA> = \"BSH.Common.EnumType.Off" => unknown enum type or enum member BSH.Common.EnumType.Off
<DATA> = \"false\" => unknown enum type or enum member false.
<DATA> = false => unknown enum type or enum member false.
<DATA> = 0 => unknown enum type or enum member 0
<DATA> = \"Off\" => unknown enum type or enum member Off
<DATA> = \"off\" => unknown enum type or enum member off
<DATA> = \"BSH.Common.EnumType.PowerStateOff\" => unknown enum type or enum member BSH.Common.EnumType.PowerStateOff

Sehr seltsam, und ich finde eine Anomalie. Wenn man sich nämlich mit ZZZ_Dump den Hash für die Settings ansieht, steht dort
Zitat'PowerState' => ['BSH.Common.Setting','BSH.Common.EnumType.PowerState.','On',undef]
mit einem zusätzlichen Punkt nach "EnumType.PowerState".

Ich habe noch etwas mit den "Programmen mit Punkt" herumgespielt. Zur Einstellung muss man wirklich den ganzen Schmonzes mitliefern
Zitat2024.12.29 12:18:38 1: [HomeConnect] selecting program Super153045.Super1530 with uri /api/homeappliances/BOSCH-WAV28G43-68A40E7146B5/programs/selected and data {"data":{"key":"LaundryCare.Washer.Program.Super153045.Super1530"}}
Das führt zwar zu
ZitatlastErr Program not supported
- das kann man aber ignorieren, weil das Programm Super1530 ganz korrekt eingestellt wird. Das ist leicht überprüfbar, wenn man die App parallel aufruft, dann wird das sehr schön umgestellt.

Fazit: Es braucht für das Modul wirklich eine Übersetzungstabelle, die in beide Richtungen funktioniert

Key                      Anzeige      Anzeige deutsch
--------------------------------------------------
Super153045.Super1530 <=> Super1530 <=> Kurz1530
Cotton.Eco4060        <=> Eco4060  <=> Eco4060
DownDuvet.Duvet      <=> Duvet    <=> Steppdecken
Mix.NightWash        <=> NightWash <=> Nachtwäsche

Also etwa
$HomeConnect_DeviceTrans_EN{"Washer"} = {
  "Cotton.Eco4060"        => "Eco4060",
  "Super153045.Super1530" => "Super1530",
  "Mix.Nightwash"         => "Nightwash",
  "DownDuvet.Duvet"       => "Duvet"
};
$HomeConnect_DeviceTrans_DE{"Washer"} = {
  "Cotton"                => "Baumwolle",
  "Cotton.Eco4060"        => "Eco4060",
  "Super153045.Super1530" => "Kurz1530",
  "EasyCare"              => "Leichte Pflege",
  "Mix"                   => "Gemischt",
  "DelicateSilk"          => "Feine Seide",
  "Wool"                  => "Wolle",
  "SportFitness"          => "Sportsachen",
  "Sensitive"             => "Empfindliche Wäsche",
  "ShirtsBlouses"         => "Hemden",
  "DarkWash"              => "Dunkle Wäsche",
  "Mix.Nightwash"         => "Nachtwäsche",
  "Towels"                => "Handtücher",
  "DownDuvet.Duvet"       => "Steppdecken",
  "DrumClean"             => "Trommelreinigung"
};
Für die Aufstellung der Set-Liste dann:
WENN eine Übersetzung in der aktuell gültigen Tabelle existiert, wird diese benutzt.
Für das Absenden an HomeConnect dann:
Suche in der aktuell gültigen Übersetzungstabelle, ob zu dem Programmnamen ein Key existiert, wenn ja, nimm diesen.

Alternative, kommt ohne englische Übersetzungstabelle aus:
Für die Aufstellung der Set-Liste
Nimm nur den Anteil des vollen Programmnamens NACH dem Punkt
Für das Absenden an HomeConnect dann:
Nimm den vollen Programmnamen, in welchem der abgekürzte Programmname als substring vorkommt.

LG

pah

Adimarantis

Über die App kann ich meine Waschmaschine auch ausschalten - jetzt müsste man nur wissen was die verwendet, denn ich bin mir sicher dass wir das laut API Doc korrekt machen.

Der "Punkt" ist mir auch schon aufgefallen, fand den soweit aber unschädlich. Das hat an der Stelle keinen Einfluss darauf wie der API Call gemacht wird.

Ich habe jetzt mal eine Version eingecheckt, die die Programme übersetzt. Für die Rückübersetzung wird ein "retrans" hash erzeugt. Grundsätzlich scheint das zu funktionieren.
FHEM mag allerdings keine Leerzeichen in den Pulldown Listen. Ich habe jetzt schon mal einige Tabellen angepasst (auch teilweise die Begriffe so angepasst, dass die dazu passen, was auf meiner Waschmaschine/Trockner stehen).
Sicherheitshalber übersetze ich alle Leerzeichen mal in Unterstriche - allerdings ohne Rückübersetzung - das kann genauso schief gehen. Ich denke da müssen wir uns einigen: Entweder sind Leerzeichen verboten oder sie werden in "_" übersetzt - dann sind "_" aber verboten.

Hab jetzt noch nicht probiert auf Englisch zu stellen, dann sollten aktuell aber einfach die internen Namen verwendet werden.

Bei den korrekten Abläufen fühle ich mich wie auf einem sinkenden Schiff:
Kaum stopft man ein Leck (so dass ein Gerät schön funktioniert), tut sich ein anderes auf (weil das es dann doch irgendwie leicht anders macht) - und jetzt hab ich nur 3 Geräte...

Gruß,
Jörg


Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Shadow3561

Moin,
ich hänge mal meine verbastelte Version an.
Zumindest bei mir funktioniert das ausschalten vom GS und Waschtrockner damit.

Mit freundlichen Grüßen

Prof. Dr. Peter Henning

Bei der Spülmaschine geht das auch bei mir, in beide Richtungen, über einen Trockner kann ich nichts aussagen.

Der Witz bei der Waschmaschine ist allerdings, dass sie zwar ausgeschaltet, per Fernbedienung aber nicht wieder eingeschaltet werden kann. Da haben sie jetzt irgendetwas im API verbogen.
ZitatBei den korrekten Abläufen fühle ich mich wie auf einem sinkenden Schiff:
Willkommen im Club.

Die Problematik bei den "gepunkteten" Programmen zeigt ganz deutlich, dass das API Bugs hat. 
LG

pah

Adimarantis

@Shadow:
Danke - wie schon vom Vorredner bemerkt: Trockner und Geschirrspüler funktionieren - die Waschmaschine mag nicht.
Und nach kurzem Überfliegen von deinem Code, sendest du Kommandos ganz generisch und da kommt wahrscheinlich die selbe Nachricht raus.
Da macht die App irgendwas anderes - vielleicht geht das bei der WM nicht über die "settings" Schnittstelle. Hab aber jetzt mal in Blaue versucht was mit Power und PowerState über "commands" abzufeuern - mag er aber auch nicht.

Sehe ich das Richtig, dass du deine Readings mit allen Options befüllst (anstatt die Options in einer internen Struktur zu halten)?
Irgendwelche Erkenntnisse aus deiner Arbeit, die man übernehmen könnte?

Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Shadow3561

Zitat von: Adimarantis am 29 Dezember 2024, 19:33:04Sehe ich das Richtig, dass du deine Readings mit allen Options befüllst (anstatt die Options in einer internen Struktur zu halten)?
Irgendwelche Erkenntnisse aus deiner Arbeit, die man übernehmen könnte?


Ich habe eine der ersten Versionen von pah genommen und dann darauf aufgebaut bzw. an meine Geräte angepasst.
Unsere Meinungen bezüglich der Readings/des state gingen dort etwas auseinander.
Ich nutze da doch lieber userReadings um alles anzupassen. Die erspart mir das rumgebastel (mehr ist es bei mir nicht) im Modul.
Den state vom Modul kann ich mit den "show_"-Attributen beeinflussen. Dies fand ich angenehmer und intuitiver für unerfahrene User.
Anbei mal ein list vom GS

nternals:
   DEF        hcconn xxxxx
   FUUID      64d48c39-f33f-d66d-aa1c-b5ede0d0300aec3a
   FVERSION   48_HomeConnect.pm:?/2024-04-10
   NAME       SMV8YCX03E
   NR         1413
   STATE      Bereit
   TYPE       HomeConnect
   aliasname  Geschirrspüler
   brand      Bosch
   eventChannelTimeout 1735498417.55091
   eventCount 47231
   haId       xxxxxx
   hcconn     hcconn
   options    StartInRelative,ExtraDry,HygienePlus,IntensivZone,VarioSpeedPlus
   prefix     Dishcare.Dishwasher
   programs   Intensiv70,Auto2,Eco50,Glas40,PreRinse,NightWash,Kurz60,MachineCare,MixedLoad,Quick45
   retrycounter 0
   type       Dishwasher
   vib        SMV8YCX03E
   READINGS:
     2024-09-25 18:12:35   BSH.Common.Event.ProgramAborted BSH.Common.EnumType.EventPresentState.Present
     2024-12-29 13:43:37   BSH.Common.Event.ProgramFinished BSH.Common.EnumType.EventPresentState.Off
     2024-12-29 13:43:37   BSH.Common.Option.ProgramProgress 0 %
     2024-12-29 13:43:37   BSH.Common.Option.RemainingProgramTime 15120 seconds
     2024-12-19 10:04:03   BSH.Common.Option.StartInRelative 0 seconds
     2024-12-29 13:43:32   BSH.Common.Root.ActiveProgram -
     2024-12-29 13:43:37   BSH.Common.Root.SelectedProgram Eco50
     2024-12-29 13:43:37   BSH.Common.Setting.PowerState BSH.Common.EnumType.PowerState.Off
     2024-12-29 18:33:25   BSH.Common.Status.DoorState BSH.Common.EnumType.DoorState.Closed
     2024-12-29 13:43:37   BSH.Common.Status.OperationState BSH.Common.EnumType.OperationState.Ready
     2024-12-28 12:16:07   BSH.Common.Status.RemoteControlActive 1
     2024-11-30 12:16:16   BSH.Common.Status.RemoteControlStartAllowed 0
     2024-10-22 17:08:19   Dishcare.Dishwasher.Option.ExtraDry 0
     2024-09-23 23:51:59   Dishcare.Dishwasher.Option.IntensivZone 0
     2024-04-19 14:33:15   Dishcare.Dishwasher.Option.SilenceOnDemand 0
     2024-12-07 16:59:04   Dishcare.Dishwasher.Option.VarioSpeedPlus 0
     2024-12-29 13:43:37   SelectedProgram Eco50
     2024-12-29 19:53:37   door-state      closed
     2024-12-29 19:53:37   remaining-time  04:12
     2024-12-29 13:43:37   state           Bereit
   data:
     options:
       ExtraDry:
         Dishcare.Dishwasher.Option
         Boolean
         0
        
         1
         undef
       HygienePlus:
         Dishcare.Dishwasher.Option
         Boolean
         0
        
         1
         undef
       IntensivZone:
         Dishcare.Dishwasher.Option
         Boolean
         0
        
         1
         undef
       StartInRelative:
         BSH.Common.Option
         Int
         undef
         (0,86400)
         undef
         undef
       VarioSpeedPlus:
         Dishcare.Dishwasher.Option
         Boolean
         0
        
         1
         undef
     trans:
       Auto2      Auto 45-65
       Eco50      Eco 50
       Favorite.001 Favorit
       GlassShine Brilliant Shine
       Intensiv70 Intensiv 70
       Kurz60     Speed 60
       MachineCare Maschinenpflege
       NightWash  Leise
       PreRinse   Vorspülen
       Quick45    Speed 45
Attributes:
   alias      Geschirrspüler
   icon       scene_dishwasher
   room       Küche
   show_end   1
   show_end_time 1
   show_progress 1
   type       Dishwasher
   userReadings door-state {ReadingsVal($name,"BSH.Common.Status.DoorState",0) eq "BSH.Common.EnumType.DoorState.Open" ? "open" : "closed"},
remaining-time { strftime('%H:%M', gmtime(ReadingsNum($NAME, "BSH.Common.Option.RemainingProgramTime", 0))) }
   verbose    2
   webCmd     BSH.Common.Root.SelectedProgram:startProgram

Mit meinem Waschtrockner ist es auch so eine Sache.
Diesen kann ich zwar starten, stoppen und bekomme plausible readings, aber es werden keine Programme oder options von der API geladen.
anbei auch hier ein List
Internals:
   DEF        hcconn xxxxx
   FUUID      65d63627-f33f-d66d-8977-001abf58c9f242bf
   FVERSION   48_HomeConnect.pm:?/2024-04-10
   NAME       WNC244070
   NR         1511
   STATE      Ruhezustand
   TYPE       HomeConnect
   aliasname  Waschtrockner
   brand      Bosch
   eventChannelTimeout 1735498632.79754
   eventCount 49394
   haId       xxxxx
   hcconn     hcconn
   prefix     LaundryCare.WasherDryer
   retrycounter 0
   type       WasherDryer
   vib        WNC244070
   READINGS:
     2024-12-10 19:41:10   BSH.Common.Event.ProgramAborted BSH.Common.EnumType.EventPresentState.Off
     2024-12-29 15:22:57   BSH.Common.Event.ProgramFinished BSH.Common.EnumType.EventPresentState.Off
     2024-12-29 17:53:04   BSH.Common.Option.EstimatedTotalProgramTime 60 seconds
     2024-12-29 15:22:57   BSH.Common.Option.FinishInRelative 8940 seconds
     2024-12-29 17:53:05   BSH.Common.Option.ProgramProgress 0 %
     2024-12-29 15:18:46   BSH.Common.Option.RemainingProgramTime 60 seconds
     2024-12-29 15:22:57   BSH.Common.Root.ActiveProgram -
     2024-12-29 17:53:04   BSH.Common.Root.SelectedProgram -
     2024-12-29 09:37:28   BSH.Common.Setting.ChildLock 0
     2024-12-29 17:53:04   BSH.Common.Setting.PowerState BSH.Common.EnumType.PowerState.Off
     2024-12-29 15:22:57   BSH.Common.Status.DoorState BSH.Common.EnumType.DoorState.Open
     2024-12-29 17:53:05   BSH.Common.Status.OperationState BSH.Common.EnumType.OperationState.Inactive
     2024-12-15 08:23:37   BSH.Common.Status.RemoteControlActive 1
     2024-12-29 15:22:57   BSH.Common.Status.RemoteControlStartAllowed 0
     2024-12-29 19:57:12   Endzeit         19:58
     2024-12-29 14:28:48   LaundryCare.Washer.Option.SpinSpeed LaundryCare.Washer.EnumType.SpinSpeed.RPM1200
     2024-12-29 10:32:59   LaundryCare.Washer.Option.Temperature LaundryCare.Washer.EnumType.Temperature.GC40
     2024-12-29 19:57:12   Restlaufzeit_in_minuten 1
     2024-12-29 19:57:12   Schleuderdrehzahl 1200 U/min
     2024-12-29 17:53:04   SelectedProgram -
     2024-12-29 19:57:12   Temperatur      40
     2024-12-29 19:57:12   door-state      open
     2024-12-29 19:57:12   operation-progress 0
     2024-12-29 19:57:12   operation-state Finished
     2024-12-29 15:22:57   program_active  HHSynthetics
     2024-12-29 19:57:12   remaining-time  00:01
     2024-12-29 17:53:05   state           Ruhezustand
   data:
     trans:
       Cotton     Baumwolle
       DarkWash   Dunkle Wäsche
       DelicateSilk Feine Seide
       DelicatesSilk Fein/Seide
       EasyCare   Leichte Pflege
       Mix        Gemischt
       Sensitive  Empfindliche Wäsche
       ShirtsBlouses Hemden
       SportFitness Sportsachen
       Towel      Handtücher
       Wool       Wolle
Attributes:
   alias      Waschtrockner
   icon       scene_washing_machine
   room       Büro
   show_end   1
   show_end_time 1
   show_progress 1
   type       Washer
   userReadings remaining-time { strftime('%H:%M', gmtime(ReadingsNum($NAME, "BSH.Common.Option.RemainingProgramTime", 0))) }, operation-state {ReadingsVal($name,"BSH.Common.Status.OperationState",0) eq "BSH.Common.EnumType.OperationState.Run" ? "Run" : "Finished"}, door-state {ReadingsVal($name,"BSH.Common.Status.DoorState",0) eq "BSH.Common.EnumType.DoorState.Open" ? "open" : "closed"}, program_active {(split( '\.', ReadingsVal($NAME,"BSH.Common.Root.ActiveProgram","")))[4]}, Schleuderdrehzahl {(split( 'RPM', ReadingsVal($NAME,"LaundryCare.Washer.Option.SpinSpeed","")))[1]." U/min"}, Temperatur {(split( '([0-9][0-9]|Auto)', ReadingsVal($NAME,"LaundryCare.Washer.Option.Temperature","")))[1]}, program_selected {(split( '\.', ReadingsVal($NAME,"BSH.Common.Root.SelectedProgram","")))[5]}, operation-progress {ReadingsNum($name,"BSH.Common.Option.ProgramProgress",0)},
Restlaufzeit_in_minuten {
my @TimeParts=split(/:/,ReadingsVal($NAME,"remaining-time","00:00"));
my $minutes=$TimeParts[0]*60 + $TimeParts[1];
return $minutes;
}, Endzeit {POSIX::strftime("%H:%M",localtime(time+(ReadingsNum("WNC244070","Restlaufzeit_in_minuten","0"))*60))}
   verbose    2
   webCmd     startProgram:stopProgram

Mit freundlichen Grüßen


Adimarantis

Heureka!

Ich hab mal eine APK-Decompiler auf die HomeConnect App losgelassen - hauptsächlich um Strings zu suchen - und dabei im Zusammenhang mit PowerState einen neuen EnumType gefunden: "MainsOff" - und siehe da: Damit kann ich meine WM ausschalten.
Die anderen Geräte mögen das natürlich nicht und jetzt ist die Frage wie man das generisch unterscheidet - zumindest sehe ich bei den "getSettings" Antworten keinen relevanten Unterschied.

Und wahrscheinlich können neuere Waschmaschinen wieder das normale "Off", so dass die Unterscheidung auf type=Washer auch gefährlich ist, aber bis sich jemand mit so einem Gerät meldet, ist das jetzt die Lösung.

Achtung: Ich habe das den set Befehl jetzt aufgeteilt: es heisst jetzt "set ... Power On" , "set Power Off" etc.
Ist in der GUI einfach übersichtlicher.

Jörg

Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)