Änderung SV-Kanalzuordnung zerstört Programme

Fehler in Firmware und WebUI & Workarounds

Moderator: Co-Administratoren

Benutzeravatar
Black
Beiträge: 2030
Registriert: 12.09.2015, 22:31
Wohnort: Wegberg
Hat sich bedankt: 9 Mal
Danksagung erhalten: 30 Mal
Kontaktdaten:

Re: Änderung SV-Kanalzuordnung zerstört Programme

Beitrag von Black » 06.06.2019, 12:18

also das löschen oder das verändern zu verhindern finde ich... quatsch

es muss an der stelle einfach nur gewährleistet werden, dass die bezüge und verweise in sich korrekt und kosistent sind.
das sind sie jetz nicht.
lösungsansatz von mir wäre:
Bei Anlegen, Löschen, verändern einer Kanalzuordnung folgender durchlauf.
Iterieren über alle enthaltenen Singleconditions und Singledestinations
ist eine eine systemvariable ohne Kanalzuweisung: ?
wenn ja: type ist ivtSystemID, xxxChannel (Conditon oder Destination) ist ID_Error
ist es eine Sysvar mit gültiger ! Kanalzuweisung oder ein HSSDP ?
wenn ja Type ist ivtrObjectId, xxxChannel (Conditon oder Destination) ist der Kanal der Sysvar bzs des HSS.

Das ist die ganze kunst.

was anderes macht der sdv auch nicht, wenn dann in einem Programm eine Sysvar mit Kanalzuweisung geändert wird, dass dort der Kanalbezug entfernt wird, dann erscheint nach dem Korrekturlauf des SDV das programm wieder in der Form, das dort eine Systemvariable angeboten wird, und zwar die richtige.

Black
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 3.47.18.20190918 mit Groundplane Antennenmod und depatchter Favoritensortierung
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker unter ProxMox auf NUC als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.3
SDV 3.09.01 Scripteditor und Objektinspektor

Benutzeravatar
jmaus
Beiträge: 5024
Registriert: 17.02.2015, 14:45
Wohnort: Dresden
Hat sich bedankt: 6 Mal
Danksagung erhalten: 79 Mal
Kontaktdaten:

Re: Änderung SV-Kanalzuordnung zerstört Programme

Beitrag von jmaus » 06.06.2019, 13:08

Black hat geschrieben:
06.06.2019, 12:18
lösungsansatz von mir wäre:
Bei Anlegen, Löschen, verändern einer Kanalzuordnung folgender durchlauf.
Iterieren über alle enthaltenen Singleconditions und Singledestinations
ist eine eine systemvariable ohne Kanalzuweisung: ?
wenn ja: type ist ivtSystemID, xxxChannel (Conditon oder Destination) ist ID_Error
ist es eine Sysvar mit gültiger ! Kanalzuweisung oder ein HSSDP ?
wenn ja Type ist ivtrObjectId, xxxChannel (Conditon oder Destination) ist der Kanal der Sysvar bzs des HSS.

Das ist die ganze kunst.
Ich möchte hier wirklich helfen, Michael. Aber ich tue mich wirklich schwer deinen Ausführungen zu folgen. Kannst du denn das nicht anhand eines einzelnen Beispieles vielleicht sogar mit Beispiel ReGa-Skript code einmal aufzeigen damit ich das reproduzierbar nachvollziehen kann? Das würde mir wirklich ungemein helfen denn ansonsten dauert es vmtl. noch eine Weile bis ich dann dazukomme mir eigene Beispiele auszudenken die das Problem und die Reparatur/Konsistenzprüfung reproduzieren helfen.
RaspberryMatic 3.47.18.20190918 @ TinkerS mit ~160 HomeMatic Geräten + ioBroker – GitHubPayPalTwitter

Benutzeravatar
Black
Beiträge: 2030
Registriert: 12.09.2015, 22:31
Wohnort: Wegberg
Hat sich bedankt: 9 Mal
Danksagung erhalten: 30 Mal
Kontaktdaten:

Re: Änderung SV-Kanalzuordnung zerstört Programme

Beitrag von Black » 06.06.2019, 13:45

so damit es lesbarer bleibt, der Code aus PASS 1 aus der automatischen codegenerierung des SDV:

mal auf die schnelle probiert, ist lauffähig. Man könnte optimieren von hand, weiss ich , wie gesagt, aus der automatischen generierung.
das soll funktionieren, muss net toll aussehen, ich wollt für die zeilen auch keinen schönheitspreis gewinnen

Code: Alles auswählen

boolean infoAll  =  false;
boolean infotip =   true;
boolean corr =      false;
boolean infoshown= false;
string sPRG;
string sSDest;
string sCond;
string sSCond;
object oPRG;
object oRule;
object oCond;
object oSCond;
object oDest;
object oSDest;
object oOBJ;
integer iRule=1;
integer SaveID=0;
integer nErr=0;
integer nCorr=0;
integer nPRG=0;
integer x=0;
string sCorr=""; if (corr) {sCorr= " --> korrigiert"; }
string sProgInfo="";
string slinie= "----------------------------------------------------------------";
boolean isVarDP;
boolean isHssDP;
WriteLine ("ProgrammAnalyse Konsistenz ConditionChannel und DestinationChannel");
WriteLine ("Black in Juni 2019");
WriteLine (slinie);
foreach (sPRG,dom.GetObject (ID_PROGRAMS).EnumIDs () ){
  oPRG= dom.GetObject (sPRG);
  if (oPRG) {
    infoshown= false;
    sProgInfo= "Analyse Program: " # oPRG.Name () # " [ID: "# oPRG.ID () #"]";
    if (infoAll) {WriteLine (sProgInfo);}
    oRule= oPRG.Rule ();
    iRule=1;
    while (oRule){
        foreach (sCond, system.GenerateEnum (0,oRule.RuleConditions().Count()-1)) {
           oCond= oRule.RuleCondition (sCond.ToInteger () );
             foreach (sSCond, system.GenerateEnum (0,oCond.CndSingleCount ()-1)) {
                oSCond= oCond.CndSingleCondition (sSCond);
                  !- Hier sind wir in der Singlecondition
                  !- Testen auf eine Systemvariable/HSS
                  if ((oSCond.LeftValType () == ivtSystemId) || (oSCond.LeftValType() == ivtObjectId)) {
                     oOBJ= dom.GetObject (oSCond.LeftVal () );
                     if (oOBJ) {
                        isVarDP = (oOBJ.Channel() == ID_ERROR) && ((oOBJ.Type() == OT_VARDP) || (oOBJ.Type() == OT_ALARMDP));
                        isHssDP = (oOBJ.Channel() != ID_ERROR) || (oOBJ.Type() == OT_HSSDP);
                        if (isVarDP && (oSCond.LeftValType () != ivtSystemId)) {
                           !- Es muss eine SystemVariable sein, ist aber keine
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSCond.ID () # "] Rule-Nr: " # iRule # ", CND-Nr: " # (sCond.ToInteger()+1) # ", SCND-Nr: " # (sSCond.ToInteger()+1) # " -- LeftValType muss ivtSystemId sein, ist es aber nicht [" # oOBJ.Name () # "]" # sCorr);
                           if (corr) {
                               nCorr=nCorr+1;
                               x= oSCond.LeftVal ();
                               oSCond.LeftValType (ivtSystemId);
                               oSCond.LeftVal (x);
                            }
                            infoshown=true;
                        }
                        elseif (isHssDP && (oSCond.LeftValType () != ivtObjectId)) {
                           !- Es muss ein HSSDP sein, ist aber kein
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSCond.ID () # "] Rule-Nr: " # iRule # ", CND-Nr: " # (sCond.ToInteger()+1) # ", SCND-Nr: " # (sSCond.ToInteger()+1) # " -- LeftValType muss ivtObjectId sein, ist es aber nicht [" # oOBJ.Name () # "]" # sCorr);
                           if (corr) {
                               nCorr=nCorr+1;
                               x= oSCond.LeftVal ();
                               oSCond.LeftValType (ivtObjectId);
                               oSCond.LeftVal (x);
                           }
                           infoshown=true;
                        }
                        if (isHssDP && (oSCond.ConditionChannel () != oOBJ.Channel () )) {
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSCond.ID () # "] Rule-Nr: " # iRule # ", CND-Nr: " # (sCond.ToInteger()+1) # ", SCND-Nr: " # (sSCond.ToInteger()+1) # " -- ConditionChannel() indiziert nicht Object (LeftVal).Channel ()" # sCorr);
                           if (corr) {
                              nCorr=nCorr+1;
                              oSCond.ConditionChannel (oOBJ.Channel ());
                           }
                           infoshown=true;
                        }
                        elseif ((!isHssDP) && (oSCond.ConditionChannel () != ID_ERROR )) {
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSCond.ID () # "] Rule-Nr: " # iRule # ", CND-Nr: " # (sCond.ToInteger()+1) # ", SCND-Nr: " # (sSCond.ToInteger()+1) # " -- ConditionChannel() indiziert nicht ID_ERROR" # sCorr);
                           if (corr) {
                              nCorr=nCorr+1;
                              oSCond.ConditionChannel (ID_ERROR);
                           }
                           infoshown=true;
                        }
                     }
                  }
             } !- Klammer foreach Single Condition
        } !- Klammer Foreach Condition
        oDest= oRule.RuleDestination ();
        if (oDest) {
           foreach (sSDest, system.GenerateEnum (0,oDest.DestSingleCount() -1)) {
              oSDest= oDest.DestSingleDestination (sSDest.ToInteger () );
              if (oSDest) {
                  if ((oSDest.DestinationParam() == ivtSystemId) || (oSDest.DestinationParam() == ivtObjectId)) {
                     oOBJ= dom.GetObject (oSDest.DestinationDP () );
                     if (oOBJ) {
                        isVarDP = (oOBJ.Channel() == ID_ERROR) && ((oOBJ.Type() == OT_VARDP) || (oOBJ.Type() == OT_ALARMDP));
                        isHssDP = (oOBJ.Channel() != ID_ERROR) || (oOBJ.Type() == OT_HSSDP);
                        if (isVarDP && (oSDest.DestinationParam () != ivtSystemId)) {
                           !- Es muss eine SystemVariable sein, ist aber keine
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SDEST-ID: " # oSDest.ID () # "] Rule-Nr: " # iRule # ", SDEST-Nr: " # (sSDest.ToInteger()+1) # " -- DestinationParam muss ivtSystemId sein, ist es aber nicht [" # oOBJ.Name () # "]" # sCorr);
                           if (corr) {
                               nCorr=nCorr+1;
                               x= oSDest.DestinationDP ();
                               oSDest.DestinationParam (ivtSystemId);
                               oSDest.DestinationDP (x);
                            }
                            infoshown=true;
                        }
                        elseif (isHssDP && (oSDest.DestinationParam () != ivtObjectId)) {
                           !- Es muss ein HSSDP sein, ist aber kein
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SDEST-ID: " # oSDest.ID () # "] Rule-Nr: " # iRule # ", SDEST-Nr: " # (sSDest.ToInteger()+1) # " -- DestinationParam muss ivtObjectId sein, ist es aber nicht [" # oOBJ.Name () # "]" # sCorr);
                           if (corr) {
                               nCorr=nCorr+1;
                               x= oSDest.DestinationDP ();
                               oSDest.DestinationParam (ivtObjectId);
                               oSDest.DestinationDP (x);
                            }
                            infoshown=true;
                        }
                        if (isHssDP && (oSDest.DestinationChannel () != oOBJ.Channel () )) {
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSDest.ID () # "] Rule-Nr: " # iRule # ", SDEST-Nr: " # (sSDest.ToInteger()+1) # " -- DestinationChannel() indiziert nicht Object (LeftVal).Channel ()" # sCorr);
                           if (corr) {
                              nCorr=nCorr+1;
                              x= oSDest.DestinationDP ();
                              oSDest.DestinationChannel (oOBJ.Channel ());
                              oSDest.DestinationDP (x);
                           }
                           infoshown=true;
                        }
                        elseif ((!isHssDP) && (oSDest.DestinationChannel() != ID_ERROR )) {
                           if ((!infoAll) && (!infoshown)) {WriteLine (sProgInfo);}
                           if (!infoshown) {nPRG=nPRG+1;}
                           nErr=nErr+1;
                           WriteLine ("\tInkonsistenz [SCND-ID: " # oSDest.ID () # "] Rule-Nr: " # iRule # ", SDEST-Nr: " # (sSDest.ToInteger()+1) # " -- DestinationChannel() indiziert nicht ID_ERROR" # sCorr);
                           if (corr) {
                              nCorr=nCorr+1;
                              x= oSDest.DestinationDP ();
                              oSDest.DestinationChannel (ID_ERROR);
                              oSDest.DestinationDP (x);
                           }
                           infoshown=true;
                        }
                     }
                  }
              } !- if oSDest
           }  !- Foreach
        } !- oDest
      oRule= oRule.RuleSubRule ();
      iRule=iRule+1;
   } !- While Rule
  } !- if oPRG

}
  if (infoshown ) {WriteLine (slinie);}
!-**************************************************************************************************************************************
!-}
WriteLine ("Geprüft: " # dom.GetObject (ID_PROGRAMS).Count () # " Programme");
if (nErr==0) {
  WriteLine ("Keine Aufälligkeiten festgestellt");
} else {
  WriteLine ("Dabei wurden " # nErr # " Inkonsistenzen gefunden in " # nPRG # " Programmen");
  Write ("Von diesen " # nErr # " Inkonsistenzen wurden ");
  if (nCorr==0) {WriteLine ("keine korriert");} else {WriteLine (nCorr # " korrigiert"); }
}
gruss, Black
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 3.47.18.20190918 mit Groundplane Antennenmod und depatchter Favoritensortierung
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker unter ProxMox auf NUC als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.3
SDV 3.09.01 Scripteditor und Objektinspektor

Benutzeravatar
jmaus
Beiträge: 5024
Registriert: 17.02.2015, 14:45
Wohnort: Dresden
Hat sich bedankt: 6 Mal
Danksagung erhalten: 79 Mal
Kontaktdaten:

Re: Änderung SV-Kanalzuordnung zerstört Programme

Beitrag von jmaus » 06.06.2019, 14:23

Danke Michael, das hilft ungemein weiter. Werde ich dann mal versuchen einzusetzen bzw,. zu analysieren um das Problem direkt in ReGa/WebUI bereits abzufangen.
RaspberryMatic 3.47.18.20190918 @ TinkerS mit ~160 HomeMatic Geräten + ioBroker – GitHubPayPalTwitter

Benutzeravatar
koppenho
Beiträge: 221
Registriert: 27.12.2013, 09:12
Wohnort: Bad Neustadt, Deutschland

Re: Änderung SV-Kanalzuordnung zerstört Programme

Beitrag von koppenho » 06.06.2019, 19:12

Hypnos hat geschrieben:
06.06.2019, 08:48
koppenho hat geschrieben:
05.06.2019, 19:35
Wenn die Programme, bzw. die Kodierung der WebUI-Konditionen eine Kanalzuordnung ignorieren, würde nichts passieren. Nach dem Löschen einer Kanalzuordnung sollte es in der WebUI so aussehen, als ob es nie eine Zuordnung gegeben hätte. Eine WebUI-Programm sollte dann eine einfache SV referenzieren.
Das ist aber auch gefährlich. Wenn ich eine Systemvariable lösche und deren Bedingung und Logik damit automatisch aus allen Programmen entfernt wird, ändert sich ja damit die Logik der Programme.
Löschen einer SV haben wir noch noch gar nicht betrachtet. Wir diskutierten bisher nur über die Änderung/Löschung einer Kanalbindung bei dem die SV erhalten bleibt.
Hypnos hat geschrieben:
06.06.2019, 08:48
Da sollte zumindest eine auffällige Warnung angezeigt werden.
Die Sichere Variante wäre es einfach das Löschen zu verbieten, solange eine Systemvariable noch in einem Programm enthalten ist.
Dem kann ich nur zustimmen.

Es gibt noch eine Situation, die wir bisher übersehen haben. Was passiert mit der Kanalbindung wenn das zum Kanal gehörende Gerät gelöscht wird? Erwarten würde ich, dass die Bindung entfernt wird und die SV ansonsten unversehrt zurückbleibt.
--
Andreas
--------------------------------------------
Hauptwohnung: RaspberryMatic mit 288 Kanäle in 100 Geräten und 132 CUxD-Kanäle in 32 CUxD-Geräten
Zweitwohnung: CCU2 mit 16 Kanäle in 6 Geräten und 12 CUxD-Kanäle in 4 CUxD-Geräten
--------------------------------------------

Benutzeravatar
Black
Beiträge: 2030
Registriert: 12.09.2015, 22:31
Wohnort: Wegberg
Hat sich bedankt: 9 Mal
Danksagung erhalten: 30 Mal
Kontaktdaten:

Re: Änderung SV-Kanalzuordnung zerstört Programme

Beitrag von Black » 06.06.2019, 20:14

@koppenho

beim löschen bleibt bekannterweise ein Geisterbezug stehen. Die aktuelle raspberrymatik sollte (konjunktiv) dieses bei regastart aber glattziehen können (ansonsten der SDV Menüpunkt CheckChannel Sysvar).

Nach diesem Lauf zieht Cond-Dest Channel die restlichen bezüge wieder grade.

Black
Die Wahrheit ist ein Chor aus Wind
Meine Seite, ok noch bisschen im Aufbau

RaspberryMatic 3.47.18.20190918 mit Groundplane Antennenmod und depatchter Favoritensortierung
jede Menge Sensoren und Aktoren, Logamatic 2107 Gateway zum Buderus Kessel
ioBroker unter ProxMox auf NUC als Hauptsteuersystem und Visualisierung
Script Time Scheduler V1.3
SDV 3.09.01 Scripteditor und Objektinspektor

Antworten

Zurück zu „HomeMatic - bekannte Bugs“