Wert-Parameter bei UpdateFormField funktioniert nicht mit String 'invalid'

Wenn ich bei UpdateFormField einen Wert vom Typ String mit dem Inhalt ‚invalid‘ übergebe, ändert die Console das Element der Form nicht.

Eine kleine Änderung wie ‚inval1d‘ und schon geht es.
Den Wert mag die Konsole scheinbar nicht :slight_smile:

{
      "name": "Eventhook",
     "type": "Label",
     "caption": "nicht invalid"
}

 $this->UpdateFormField('Eventhook', 'caption', 'invalid'); // nicht ok
 $this->UpdateFormField('Eventhook', 'caption', 'Invalid'); // nicht ok
 $this->UpdateFormField('Eventhook', 'caption', 'inval1d'); // ok
 $this->UpdateFormField('Eventhook', 'caption', 'invalid1'); // ok

Michael
PS: Betrifft nur die WebConsole, die Legacy schluckt es.

Ich kann das nicht reproduzieren, bei mir funktioniert das einwandfrei. Kommt bei dir irgend eine Fehlermeldung? Hast du ein Modul parat, in dem der Fehler auftaucht, dass ich auch mal testen kann?

PS: UpdateFormField wird von der Legacy-Konsole gar nicht unterstützt

Es könnte sein das es in der Legacy nicht auffällt durch das neu laden der Form beim speichern…
Kann das aber erst heute Abend noch einmal testen.
Leider habe ich das Modul noch nicht gepusht, kommt dann auch :slight_smile:

Ergänzung:
Das Element ‚Eventhook‘ ist innerhalb eines RowLayout, vielleicht macht das einen Unterschied?
Michael

Kommt die Änderung ungefähr zeitgleich mit einem neuen Laden der Form? Das könnte natürlich Probleme machen. Updatenachrichten werden erst empfangen, wenn die Form komplett geladen ist. Wenn du also während des Ladens Nachrichten verschickst, dann könnten diese zu früh ankommen und nicht verarbeitet werden.

Das RowLayout sollte keine Probleme machen.

Ich lade die Form ja selber nicht neu, dies machen die Konsolen ja eigenständig beim übernehmen der Konfiguration.
GetConfigurationForm wird somit auf jede Fall vor dem UpdateFormField ausgeführt.
Das sehe ich auch, weil im Actions Bereich, wo dieses Feld ist, ist noch der alte Wert (wird in GetConfigurationForm aus einem Attribute gelesen) und dann kommt erst später der neue Wert, wenn ich das neue Attribut setze.
Ich trace das gleich Mal mit vielen Debug Meldungen.
Michael

Das klingt für mich so, als wenn UpdateFormField hier nicht die passende Funktion ist. Möchtest du stattdessen nicht einfach deine Rückgabe von GetConfigurationForm entsprechend anpassen?

Ja, da mache ich das ja auch :slight_smile:
Damit die Anzeige beim öffnen stimmt.

Aber beim übernehmen und neu laden der Form sind die Fähigkeiten des Endgerätes noch nicht ermittelt, somit steht da in der Form der alte Wert.
Das ermitteln der Fähigkeiten kommt erst nach den Applychanges und dauert ein paar ms. Dann werden die Ergebnisse in Attributen gespeichert und mit UpdateFormField die Anzeige aktualisiert.

Ich könnte natürlich in GetConfigurationForm etwas einbauen das auf die Aktualisierung der Attribute wartet. Verzögert dann aber unnötig die Darstellung in der Konsole.

Bin natürlich noch nicht dazu gekommen mir das abzusehen; plötzlich Besuch bekommen :slight_smile:

Michael

Gerade ist mir etwas aufgefallen…
Das ermitteln der Fähigkeiten und setzen der Attribute erfolgt ja im Kontex von Applychanges.
Somit muss die Anzeige in der Konsole ja durch GetConfigurationForm korrekt sein, weil die Konsole ja auf die Funktion Applychanges wartet.
Eventuell wartet die WebConsole hier nicht auf die Beendigung des Applychanges?
Während es die legacy macht und darum hier die Anzeige korrekt ist.
Dann hast du auch rechte das
a) die legacy natürlich kein UpdateFormField kann
b) UpdateFormField hier unnötig ist, sofern es im Kontex von Applychanges läuft.
Michael

Fehler gefunden:
Ich kann jetzt bestätigen, das es nur ein Problem beim Element ‚Lable‘ und dem Wert ‚caption‘ gibt.
Es liegt an den alten Inhalt des Labels. Wenn ein alter Werte als Hyperlinks erkannt und dargestellt wurde, kann dieser nicht verändert werden.
Davon abgesehen, möchte ich den Inhalt auch gar nicht als funktionfähigen Hyperlink in der Konsole haben.
Bitte ein optionalen Parameter um das abzuschalten.
Ein „link“:false funktioniert nicht :frowning:

Um den Gedankengang zum Verhalten der beiden Konsolen abzuschließen, hier meine Testergebnise.

Wie erwartet, die Legacy-Konsole wartet bis das ApplyChanges durch ist.
Somit sind die UpdateFormField überflüssig; kann die Konsole auch nicht.
Habe mich in die Irre führen lassen, weil die Anzeige hier immer korrekt ist.
Debug bei Nutzung der Legacy-Konsole (alles okay):


TXT: 15.10.2019, 19:33:33 |  ApplyChanges | Start
TXT: 15.10.2019, 19:33:33 |        Send Function | GetVideoSources
TXT: 15.10.2019, 19:33:34 |        Send Function | GetCapabilities
TXT: 15.10.2019, 19:33:34 |        Send Function | GetEventProperties
TXT: 15.10.2019, 19:33:34 |      UpdateFormField | Events values -> [{"Topic":"tns1:VideoSource\/MotionAlarm","Source"....ta":"State"}]
TXT: 15.10.2019, 19:33:34 |      UpdateFormField | Events visible -> 1
TXT: 15.10.2019, 19:33:34 |      UpdateFormField | Eventhook caption -> http://192.168.201.7:3777/hook/ONFIVEvents/IO/36372
TXT: 15.10.2019, 19:33:34 |        Send Function | Subscribe
TXT: 15.10.2019, 19:33:34 |      UpdateFormField | SubscriptionReference caption -> http://192.168.201.115/Web_Service?Idx=0
TXT: 15.10.2019, 19:33:34 |      UpdateFormField | SubscriptionReferenceRow visible -> 1
TXT: 15.10.2019, 19:33:34 |  ApplyChanges | Ende
HEX: 15.10.2019, 19:33:34 |  ApplyChanges | 45 6E 64 65 
TXT: 15.10.2019, 19:33:34 | GetConfigurationForm | Start
TXT: 15.10.2019, 19:33:34 | GetConfigurationForm | Ende

Verhalten bei der Web-Konsole:
Diese wartet nicht auf das Ende von ApplyChanges um dann die Form neu zu laden, sondern macht dies sofort.
Somit muss ich doch mit UpdateFormField arbeiten um die Felder korrekt zu aktualisieren.


TXT: 15.10.2019, 19:42:08 |  ApplyChanges | Start
TXT: 15.10.2019, 19:42:08 |        Send Function | GetVideoSources
TXT: 15.10.2019, 19:42:08 | GetConfigurationForm | Start
TXT: 15.10.2019, 19:42:08 | GetConfigurationForm | Ende
TXT: 15.10.2019, 19:42:08 |        Send Function | GetCapabilities
TXT: 15.10.2019, 19:42:08 |        Send Function | GetEventProperties
TXT: 15.10.2019, 19:42:09 |      UpdateFormField | Events values -> [{"Topic":"tns1:VideoSource\/MotionAlarm","Source"....ta":"State"}]
TXT: 15.10.2019, 19:42:09 |      UpdateFormField | Events visible -> 1
TXT: 15.10.2019, 19:42:09 |      UpdateFormField | Eventhook Eventhook caption -> http://192.168.201.7:3777/hook/ONFIVEvents/IO/36372
TXT: 15.10.2019, 19:42:09 |             Send URI | http://192.168.201.115/onvif/device_service
TXT: 15.10.2019, 19:42:09 |        Send Function | Subscribe
TXT: 15.10.2019, 19:42:09 |      UpdateFormField | SubscriptionReference caption -> http://192.168.201.115/Web_Service?Idx=1
TXT: 15.10.2019, 19:42:09 |      UpdateFormField | SubscriptionReferenceRow visible -> 1
TXT: 15.10.2019, 19:42:09 |  ApplyChanges | Ende

Michael

Die Legacy-Konsole erhält hier die gleiche Nachricht wie die webbasierte Variante. Allerdings verwendet die webbasierte Konsole einen Websocket und erhält die Meldung damit sofort, während die Legacy-Konsole nur alle Sekunde abfragt. Dadurch ist bei der Abfrage der Legacy-Konsole halt alles schon gelaufen und es kommt nur sehr selten zu Nebenläufigkeitsproblemen. Von der Reihenfolge her werden beim Übernehmen der Änderungen übrigens zuerst die Eigenschaften übernommen, dann die Nachricht rausgeschickt und abschließend die ApplyChanges des Moduls aufgerufen.

Was es mit den Links auf sich hat schaue ich einmal, den Parameter kann ich auch gerne einbauen.