jens-maus / RaspberryMatic

:house: A feature-rich but lightweight, buildroot-based Linux operating system alternative for your CloudFree CCU3/ELV-Charly 'homematicIP CCU' IoT smarthome central. Running as a pure virtual appliance (ProxmoxVE, Home Assistant, LXC, Docker/OCI, Kubernetes/K8s, etc.) on a dedicated embedded device (RaspberryPi, etc.) or generic x86/ARM hardware.
https://raspberrymatic.de
Apache License 2.0
1.52k stars 186 forks source link

Zu Favoriten hinzugefügte 0er Kanäle von HM-Geräten lassen sich nicht mehr entfernen #1475

Closed Baxxy13 closed 2 years ago

Baxxy13 commented 2 years ago

Describe the bug Fügt man 0er Kanäle von HM-Geräten einem Favoriten hinzu lassen sich diese nicht mehr über Einstellungen>Favoriten>Bearbeiten entfernen. Die 0er Kanäle tauchen gar nicht erst in der Editier-Ansicht auf.

Steps to reproduce the behavior

  1. 0er Kanal eines HM-Gerätes einem Favoriten hinzufügen
  2. den Favorit editieren: Einstellungen>Favoriten>Bearbeiten
  3. der 0er Kanal ist nicht sichtbar
  4. ...

Expected behavior Wenn man die 0er Kanäle zu Favoriten hinzufügen kann sollten sie auch wieder entfernbar sein.

Screenshots ...

System information:

Additional context Der Favoriten-Editier-Bereich filtert Intern markierte Kanäle aus. Setze ich den internal-Flag beim 0er Kanal auf false ist der Kanal sichtbar und lässt sich auch entfernen.

jp112sdl commented 2 years ago

Hmm, da ist irgendeine "Spezialität" in UserTempViewIDs() des Users verborgen.

Ich habe als Admin (User ID 1004) eine Favoritenliste erstellt (hat bei mir die ID 2147 bekommen). Dort habe ich 3 Kanäle (:0; :1; :2) hinzugefügt.

Folgendes Skript, das - wie es die newFav.htm auch macht - die Favoriten-Elemente in UserTempViewIDs() hinzufügt und sofort wieder ausliest

object oUser= dom.GetObject( 1004 );
object oFav = dom.GetObject( 2147 );

oUser.UserTempViewIDs().RemoveAll();
if( oFav ) {
 string sTmp;
 foreach( sTmp, oFav.EnumIDs() ) {
  object oTmp = dom.GetObject( sTmp );
  if( oTmp ) {
   oUser.UserTempViewIDs().Add( oTmp.ID() );
   WriteLine("Object ID " # oTmp.ID() # " in UserTempViewIDs geschrieben");
  }
 }
}
WriteLine("---");
string sID;
foreach( sID, oUser.UserTempViewIDs().EnumIDs() ) {
  WriteLine("Object ID " # sID #" aus UserTempViewIDs gelesen");
}

führt zu dem Ergebnis

Object ID 2045 in UserTempViewIDs geschrieben
Object ID 2051 in UserTempViewIDs geschrieben
Object ID 1762 in UserTempViewIDs geschrieben
---
Object ID 2045 aus UserTempViewIDs gelesen
Object ID 2051 aus UserTempViewIDs gelesen

und die Objekt ID des Kanal :0 ist auf einmal verschwunden.

Vermutung: UserTempViewIDs().EnumIDs() gibt entegen der Bezeichnung EnumIDs nur EnumEnabledIDs oder EnumEnabledVisibleIDs aus?

jp112sdl commented 2 years ago

Nachtrag: Fragt man mit UserTempViewIDs().EnumEnabledInternalIDs() ab, erhält man zumindest die eine ID vom Kanal :0 zurück, dafür die anderen beiden dann nicht.

===

Ahh, ich vermute man muss die Favoritenseite umbauen, wie für die Sysvars in 0133-WebUI-Fix-AlarmSysVarInternal

added a new 0133-WebUI-Fix-AlarmSysVarInternal WebUI patch which combines the EnumIDs() and EnumEnabledInternalIDs() of the oUser.UserTempViewIDs() usage when displaying alarm variables. This is necessary because the UserTempViewIDs are IseIdArrays for which EnumIDs() does unfortunately not return sysvars which are flagged as "internal". This prevented the alarm display from showing internal alarm variables.

https://github.com/jens-maus/RaspberryMatic/releases/tag/3.59.6.20210911

jp112sdl commented 2 years ago

So, nun noch mein letzter Klecks Senf zu dem Thema: Wenn man die Änderung

...
              string sEnumUserIDs = oUser.UserTempViewIDs().EnumIDs();
              string sEnumUserInternalIDs = oUser.UserTempViewIDs().EnumEnabledInternalIDs();
              if( sEnumUserInternalIDs != "" )
              {
                if( sEnumUserIDs != "" )
                {
                  sEnumUserIDs = sEnumUserIDs # "\t" # sEnumUserInternalIDs;
                }
                else
                {
                  sEnumUserIDs = sEnumUserInternalIDs;
                }
              }
              foreach(sID, sEnumUserIDs ) 
...

aus 0133-WebUI-Fix-AlarmSysVarInternal einbaut, geht es auch hier mit den Favoriten.

Baxxy13 commented 2 years ago

Wie immer gute Arbeit! Ich habe da gleich noch ein Issue. ;-)

jens-maus commented 2 years ago

So, nun noch mein letzter Klecks Senf zu dem Thema: Wenn man die Änderung aus 0133-WebUI-Fix-AlarmSysVarInternal einbaut, geht es auch hier mit den Favoriten.

Ja, Leider hat der Ursprungsautor von ReGaHss da wohl nicht ganz konsistent mitgedacht und so ist es so das die EnumIDs() Funktion der UserTempViewIDs() andere Dinge zurückgibt als bei anderen id-arrays. Und deshalb muss man leider diesen ekligen Workaround mit der \t concatenation von EnumIDs() und EnumEnabledInternalIDs() machen wie ich das im 0133 WebUI Patch ursprünglich eingebaut hatte.

Gut das du das jetzt auch für die Favoriten eingebaut hast. Da beides thematisch ja zusammen gehört hab ich mir mal erlaubt in deinem PR das auch zusammen zu basteln, sodass der 0133 WebUI Patch nun beide Dinge dort in gleicher Art&Weise behebt. Danke nochmal!

jp112sdl commented 2 years ago

Jau, und dann sollte #1477 dann auch mit in den 0133er. Schau ich mir morgen mal an