Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Tester
    4. Test Adapter lovelace v1.2.x

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Test Adapter lovelace v1.2.x

    This topic has been deleted. Only users with topic management privileges can see it.
    • E
      Erstam Developer last edited by

      Ich habe eine Reihe von Shelly-Schaltsteckdosen und Schaltaktoren im Haus verteilt, um die Stromaufnahme diverser Geräte zu überwachen. Die verschiedenen Sensoren sind als manuelle Lovelace-Sensoren angelegt. Leider stelle ich fest, dass einzelne dieser Sensoren die Daten nicht aktualisieren und keine IoB Subscription dafür angelegt wird.

      Hier der Log von zwei Sensoren im Vergleich:

      2021-11-02 11:55:06.679 - debug: lovelace.0 (4016) Create manual sensor device: sensor.Wohnzimmer_Steckdose_Medien_Power - linkeddevices.0.Wohnzimmer.Steckdose.Medien.Power
      2021-11-02 11:55:06.670 - debug: lovelace.0 (4016) Create manual sensor device: sensor.Kueche_Kuehlschrank_Power - linkeddevices.0.Kueche.Steckdose.Kuehlschrank.Power
      2021-11-02 11:55:07.308 - debug: lovelace.0 (4016) IoB Subscribe on linkeddevices.0.Wohnzimmer.Steckdose.Medien.Power
      

      Für den Kühlschrank-Sensor findet sich kein IoB Subscribe im Log.

      Hat irgendwer eine Idee, was hier falsch laufen könnte?

      Garfonso 1 Reply Last reply Reply Quote 0
      • Garfonso
        Garfonso Developer @Erstam last edited by

        @erstam said in Test Adapter lovelace v1.2.x:

        Für den Kühlschrank-Sensor findet sich kein IoB Subscribe im Log.
        Hat irgendwer eine Idee, was hier falsch laufen könnte?

        Die subscription wird nur angelegt, wenn der adapter erkennt, dass das entsprechende Entity in der Konfiguration verwendet wird.

        Wenn es bei dir in Verwendung ist, in welcher Karte? Vielleicht muss ich das etwas dynamischer machen (aktuell wird nur nach "entity" / "entities" gesucht und daraus die Ids gesammelt).

        E 1 Reply Last reply Reply Quote 0
        • E
          Erstam Developer @Garfonso last edited by Erstam

          @garfonso : Hi Garfonso, ich verwende das in einer Auto-Entity Card, also tatsächlich nicht direkt.

          Vielleicht wäre es eine Idee, für alle Custom Sensors die Subscription anzulegen. Aus irgendeinem Grund wird das ja als Custom Sensor angelegt worden sein.

          Ich habe jetzt mal als Workaround auf einem versteckten Panel alle Power-Sensoren in eine Entity-Liste gepackt, scheint zu funktionieren.

          type: custom:auto-entities
          card:
            type: entities
            title: Aktuelle Stromverbraucher
          filter:
            include:
              - entity_id: /sensor.*_Power/
                options:
                  icon: mdi:flash-circle
            exclude:
              - state: 0
          show_empty: false
          sort:
            method: state
            reverse: true
            numeric: true
          
          Garfonso 1 Reply Last reply Reply Quote 0
          • Garfonso
            Garfonso Developer @Erstam last edited by

            @erstam
            hm, ich nehm das mal auf die Liste, dass ich mir das angucke (weiß nicht genau wann, aktuell hab ich viel erkältete Kinder um mich und komm kaum hinterher 😞 )

            1 Reply Last reply Reply Quote 0
            • N
              nachon @Garfonso last edited by nachon

              @garfonso
              Vielleicht hängt das auch mit dem Speicher gar nicht zusammen, war auch nur eine Beobachtung.

              Was aber definitiv bei mir Probleme macht ist die Preisanzeige der Tankerkoenig Card. Das funktioniert gar nicht mehr. Gerade wieder geschaut. Die Objekte zeigen etwas anderes an als in der Card angezeigt wird. Dies wird scheinbar irgendwie nicht mehr aktualisiert oder was auch immer.
              Wie kann ich da mehr erfahren oder rauskriegen? Sprich: Wie starte ich Lovelace denn im debug Modus?

              Nutzt die sonst niemand?

              Vielen Dank.

              XBiT 1 Reply Last reply Reply Quote 0
              • XBiT
                XBiT @nachon last edited by

                Hallo @nachon

                ich nutze auch den Tankerkoenig Adapter aber nicht die Card.
                Habe mir selbst eine zusammengestellt sieht so aus

                tanke.PNG

                Bei mir sind die Daten immer aktuell also wird es sicher an der Card liegen.
                Soll ich die Tankerkoenig Card mal installieren und vergleichen?

                N 1 Reply Last reply Reply Quote 0
                • N
                  nachon @XBiT last edited by

                  @xbit
                  Wenn Du kannst wäre das natürlich super.

                  Die Tankerkoenig Card sieht ja wie folgt aus:
                  Screenshot 2021-11-05 at 11.24.15.png

                  Nur wie gesagt, nach einer weile aktualisieren sich die Preise nicht mehr.
                  Screenshot 2021-11-05 at 11.26.30.png

                  Heute morgen neu gestartet, und schon findet man unterschiede. Die Datenobjekte sind aktuell, aber angezeigt wird irgendwas das beim Start gezogen wurde.

                  XBiT Garfonso 3 Replies Last reply Reply Quote 0
                  • XBiT
                    XBiT @nachon last edited by XBiT

                    @nachon

                    Habe es Installiert und werde es beobachten.

                    Hast du gesehen dass die Card vor 19Tagen ein update bekommen hat weil im HA gar keine Preise mehr angezeigt wurden.

                    Hast du diese Version schon drauf?

                    EDIT: Bei mir wird mit der Card erstmal gar kein Wert angezeigt 😞

                    Es wird nur ein Schloss Symbol angezeigt und dass auch nur mit dem parameter show_closed: true

                    wo gebe ich den open/closed Datenpunkt in der Card an?

                    tanke.PNG

                    1 Reply Last reply Reply Quote 0
                    • XBiT
                      XBiT last edited by XBiT

                      Halt sich erledigt ... hatte die Card von https://github.com/panbachi/tankerkoenig-card genommen und nicht die richtige die hier zu finden ist https://github.com/thost96/tankerkoenig-card

                      die von "panbachi" hatte aber wegen fehlender Preise ein update erhalten und die von "thost96" noch nicht, eventuell kommt da der Fehler her?

                      1 Reply Last reply Reply Quote 0
                      • A
                        andi2055 last edited by

                        Ich habe gerade (erst jetzt) von 1.5 auf 2.06 aktualisiert.
                        Auch meine custom:apexcharts-card auf die neue Version 1.10.1
                        Funktioniert nach ein paar Anpassungen für die meisten Grafiken.

                        Ich habe aber ein Pronlem, wenn in einem State die States vordefiniert sind.

                           "states": {
                              "0": "Minimal",
                              "1": "Standard",
                              "2": "Boost",
                              "3": "Maximal"
                            }
                        

                        Ohne States wird das Diagramm korrekt angezeigt, mit vordefinierten States jedoch nicht.

                        Liegt das an Lovelace oder an custom:apexcharts-card ?

                        So funktioniert es - Diagramm wird angezeigt:

                        {
                          "common": {
                            "name": "Luftgeschwindigkeit",
                            "role": "state",
                            "type": "number",
                            "unit": "",
                            "def": 0,
                            "read": true,
                            "write": true,
                            "custom": {
                              "linkeddevices.0": {
                                "enabled": true,
                                "number_unit": "",
                                "linkedId": "KG.KWL.Luftgeschwindigkeit",
                                "name": "KG KWL Luftgeschwindigkeit",
                                "role": "",
                                "mergeSettingsOnRestart": false,
                                "expertSettings": true,
                                "number_convertTo": "",
                                "number_maxDecimal": 1,
                                "number_min": 0,
                                "number_max": 3,
                                "number_calculation": "",
                                "number_calculation_readOnly": "",
                                "number_to_boolean_condition": "",
                                "number_to_boolean_value_true": "",
                                "number_to_boolean_value_false": "",
                                "number_to_string_condition": "",
                                "number_to_duration_convert_seconds": "",
                                "number_to_duration_format": "",
                                "number_to_datetime_convert_seconds": "",
                                "number_to_datetime_format": "",
                                "number_to_multi_condition": "",
                                "boolean_convertTo": "",
                                "boolean_invert": false,
                                "boolean_to_string_value_true": "",
                                "boolean_to_string_value_false": "",
                                "string_convertTo": "",
                                "string_prefix": "",
                                "string_suffix": "",
                                "string_to_boolean_value_true": "",
                                "string_to_boolean_value_false": "",
                                "string_to_number_unit": "",
                                "string_to_number_maxDecimal": "",
                                "string_to_number_calculation": "",
                                "string_to_number_calculation_readOnly": "",
                                "string_to_duration_format": "",
                                "string_to_datetime_parser": "",
                                "string_to_datetime_format": ""
                              },
                              "lovelace.0": {
                                "enabled": true,
                                "entity": "input_select",
                                "name": "KWL_Test"
                              },
                              "sql.0": {
                                "enabled": true,
                                "storageType": "Number",
                                "counter": false,
                                "aliasId": "",
                                "changesOnly": true,
                                "debounce": "1000",
                                "changesRelogInterval": "0",
                                "changesMinDelta": "0",
                                "retention": 259200
                              }
                            }
                          },
                          "native": {
                            "regType": "holdingRegs",
                            "type": "uint16be",
                            "address": 257,
                            "deviceId": 2,
                            "len": 1,
                            "offset": 0,
                            "factor": 1,
                            "poll": true
                          },
                          "acl": {
                            "object": 1636,
                            "owner": "system.user.admin",
                            "ownerGroup": "system.group.administrator",
                            "state": 1636
                          },
                          "_id": "modbus.0.holdingRegisters.40258_Luftgeschwindigkeit",
                          "type": "state",
                          "from": "system.adapter.admin.0",
                          "user": "system.user.admin",
                          "ts": 1636193311754
                        }
                        

                        So leider nicht - er findet nichts und gibt nur N/A aus

                          "common": {
                            "name": "Luftgeschwindigkeit",
                            "role": "state",
                            "type": "number",
                            "unit": "",
                            "def": 0,
                            "read": true,
                            "write": true,
                            "custom": {
                              "linkeddevices.0": {
                                "enabled": true,
                                "number_unit": "",
                                "linkedId": "KG.KWL.Luftgeschwindigkeit",
                                "name": "KG KWL Luftgeschwindigkeit",
                                "role": "",
                                "mergeSettingsOnRestart": false,
                                "expertSettings": true,
                                "number_convertTo": "",
                                "number_maxDecimal": 1,
                                "number_min": 0,
                                "number_max": 3,
                                "number_calculation": "",
                                "number_calculation_readOnly": "",
                                "number_to_boolean_condition": "",
                                "number_to_boolean_value_true": "",
                                "number_to_boolean_value_false": "",
                                "number_to_string_condition": "",
                                "number_to_duration_convert_seconds": "",
                                "number_to_duration_format": "",
                                "number_to_datetime_convert_seconds": "",
                                "number_to_datetime_format": "",
                                "number_to_multi_condition": "",
                                "boolean_convertTo": "",
                                "boolean_invert": false,
                                "boolean_to_string_value_true": "",
                                "boolean_to_string_value_false": "",
                                "string_convertTo": "",
                                "string_prefix": "",
                                "string_suffix": "",
                                "string_to_boolean_value_true": "",
                                "string_to_boolean_value_false": "",
                                "string_to_number_unit": "",
                                "string_to_number_maxDecimal": "",
                                "string_to_number_calculation": "",
                                "string_to_number_calculation_readOnly": "",
                                "string_to_duration_format": "",
                                "string_to_datetime_parser": "",
                                "string_to_datetime_format": ""
                              },
                              "lovelace.0": {
                                "enabled": true,
                                "entity": "input_select",
                                "name": "KWL_Test"
                              },
                              "sql.0": {
                                "enabled": true,
                                "storageType": "Number",
                                "counter": false,
                                "aliasId": "",
                                "changesOnly": true,
                                "debounce": "1000",
                                "changesRelogInterval": "0",
                                "changesMinDelta": "0",
                                "retention": 259200
                              }
                            },
                            "states": {
                              "0": "Minimal",
                              "1": "Standard",
                              "2": "Boost",
                              "3": "Maximal"
                            }
                          },
                          "native": {
                            "regType": "holdingRegs",
                            "type": "uint16be",
                            "address": 257,
                            "deviceId": 2,
                            "len": 1,
                            "offset": 0,
                            "factor": 1,
                            "poll": true
                          },
                          "acl": {
                            "object": 1636,
                            "owner": "system.user.admin",
                            "ownerGroup": "system.group.administrator",
                            "state": 1636
                          },
                          "_id": "modbus.0.holdingRegisters.40258_Luftgeschwindigkeit",
                          "type": "state",
                          "from": "system.adapter.admin.0",
                          "user": "system.user.admin",
                          "ts": 1636193311754
                        }
                        
                        type: custom:apexcharts-card
                        header:
                          show: true
                          title: ApexCharts-Card
                          show_states: true
                          colorize_states: true
                        series:
                          - entity: input_select.KWL_Test
                        

                        d1cc4568-8e9e-4b14-a485-84438c6ab7ec-grafik.png

                        Danke für eure Hilfe!

                        Garfonso 1 Reply Last reply Reply Quote 0
                        • XBiT
                          XBiT @nachon last edited by

                          @nachon

                          Kurze Info:

                          Vom 5.11 bis heute 08.11 werden die Preise mit der Tankerkoenig Card bei mir richtig angezeigt.

                          N Garfonso 2 Replies Last reply Reply Quote 0
                          • N
                            nachon @XBiT last edited by

                            @xbit
                            Hey, super, vielen Dank. Nein, das Update ist mir irgendwie durchgerutscht. Gut möglich, das tatsächlich daher der Fehler kommt. Ich werde es anpassen.
                            Vielen Dank für den Hinweis und die Unterstützung. Ich gebe nochmal eine Rückmeldung dazu.

                            1 Reply Last reply Reply Quote 0
                            • Garfonso
                              Garfonso Developer @XBiT last edited by

                              @xbit
                              wenn du deine eigene Karte noch in der Visualisierung hast, ist das auch keine Überraschung. 🙂

                              Es liegt ziemlich sicher an der Karte...
                              @nachon: Ein workaround wäre die entities in einer anderen Karte irgendwo in die Config zu tun (z.B. auf ein Panel, was nicht genutzt wird oder so hust) -> dann sollte es gehen. 🙂

                              Den Adapter im Debug modus starten geht über Admin -> Instanzen. Da musst du den Expertenmodus anschalten und dann kannst du bei Lovelace einstellen, dass er debug statt info ausgeben soll. Dann startet der Adapter neu und du kannst gucken (da wird dann seeeeeeehr viel stehen und man sollte das vermutlich auch eher wieder aus machen, weil der sehr viel erzählt im Debug modus. Ist so eine Eigenart von mir 😉 brauche immer Ausgaben.)

                              XBiT 1 Reply Last reply Reply Quote 0
                              • Garfonso
                                Garfonso Developer @andi2055 last edited by

                                @andi2055
                                hm... mit "states" werden die Werte von Zahlen in die Zeichenkette konvertiert... warum willst du das denn so da haben? Ich würde jetzt spontan sagen, dass man die Zeichenketten für ein sinnvolles Diagramm wieder in Zahlen zurück konvertieren müsste. Kann die Apexcharts Karte das? Und reicht dir nicht einfach die History aus? grübel

                                A 1 Reply Last reply Reply Quote 0
                                • A
                                  andi2055 @Garfonso last edited by

                                  @garfonso sagte in Test Adapter lovelace v1.2.x:

                                  @andi2055
                                  hm... mit "states" werden die Werte von Zahlen in die Zeichenkette konvertiert... warum willst du das denn so da haben? Ich würde jetzt spontan sagen, dass man die Zeichenketten für ein sinnvolles Diagramm wieder in Zahlen zurück konvertieren müsste. Kann die Apexcharts Karte das? Und reicht dir nicht einfach die History aus? grübel

                                  Ich setze den Wert über ein anderes Drop-Down und da hilft mir "Minimal""Standard"..."Maximal" mehr als 1,2,3,4...
                                  Das hatte mit der alten Lovelace und Apexcharts Version funktioniert. Daher die Frage wer "Schuld" ist.
                                  Notfalls lasse ich die States eben raus. Dachte nur, dass es evtl. ein generelles Problem im Umgang mit vordefinierten States ist...?

                                  Garfonso 1 Reply Last reply Reply Quote 0
                                  • Garfonso
                                    Garfonso Developer @andi2055 last edited by

                                    @andi2055

                                    hm.. ok.. ja, kann sein, dass die 1.5 das noch nicht so konsequent gemacht hat, wie die 2.0.6... Das gab an anderer Stelle Probleme (bin mir gerade nicht mehr ganz sicher wo).

                                    Standen denn im Diagramm die Zahlen? Oder die Namen?

                                    Du könntest, wenn du magst, nochmal von github https://github.com/Garfonso/ioBroker.lovelace installieren, da hab ich gerade noch eine Sache gefunden, die damit vielleicht zu tun haben kann...

                                    A 1 Reply Last reply Reply Quote 0
                                    • A
                                      andi2055 @Garfonso last edited by

                                      @garfonso

                                      mit dieser Version war extrem viel von meiner sonstigen Konfig "kaputt"... konnte ich nicht wirklich testen.
                                      06822bce-fe65-4ef7-b834-00aaff2aa76c-grafik.png

                                      Garfonso 1 Reply Last reply Reply Quote 0
                                      • nukleuz
                                        nukleuz last edited by nukleuz

                                        Hallo mal wieder,

                                        endlich wieder im Thema 🙂

                                        Gleich nach Update auf Version 2.06 ein paar Probleme... (installiert von GITHub)

                                        lovelace.0
                                        	2021-11-10 20:14:35.283	warn	Error in camera_proxy_stream: Error: no entity found - Error: no entity found at WebServer._getImage (/opt/iobroker/node_modules/iobroker.lovelace/lib/server.js:2179:19) at /opt/iobroker/node_modules/iobroker.lovelace/lib/server.js:1983:41 at Layer.handle [as handle_request] (/opt/iobroker/node_modules/express/lib/router/layer.js:95:5) at next (/opt/iobroker/node_modules/express/lib/router/route.js:137:13) at Route.dispatch (/opt/iobroker/node_modules/express/lib/router/route.js:112:3) at Layer.handle [as handle_request] (/opt/iobroker/node_modules/express/lib/router/layer.js:95:5) at /opt/iobroker/node_modules/express/lib/router/index.js:281:22 at param (/opt/iobroker/node_modules/express/lib/router/index.js:354:14) at param (/opt/iobroker/node_modules/express/lib/router/index.js:365:14) at Function.process_params (/opt/iobroker/node_modules/express/lib/router/index.js:410:3)
                                        

                                        Ich habe auch den JS-Controller auf den aktuellen Stand gebracht - 3.3.18

                                        Ebenfalls wurden auch die Auto-Entitäten namentlich geändert, sowie einige manuelle Entitäten sind zwar konfiguriert, aber in der Übersicht nicht aufgelistet. Ich muss in den Datenpunkten die Entität deaktivieren -> speichern -> aktivieren -> dann läuft es wieder (!?!?) Mhhhh...

                                        Ne Idee?

                                        Danke vorab.

                                        EDIT: Auch nach dem oben genannten Prozedere sind heute erneut einige von den manuell angelegten Entitäten nicht mehr verfügbar trotz korrekter Konfiguration im Datenpunkt... Gestern neu angelegt heute nicht mehr da...

                                        04e5a3df-f431-45f4-a135-af8620e0cfc5-grafik.png

                                        acc526f0-575e-4798-9b34-a806ac44802e-grafik.png

                                        Hier müsste die Entität auftauchen:
                                        6f04e228-5bf4-47e0-a954-36b58f04dca2-grafik.png

                                        Neustart des Adapters ohne Erfolg.

                                        Hat sich denn so gravierend was verändert von 2.04 zu 2.06, oder raff ich hier was nicht 🕶

                                        nukleuz Garfonso 2 Replies Last reply Reply Quote 0
                                        • nukleuz
                                          nukleuz @nukleuz last edited by nukleuz

                                          @nukleuz

                                          Also, ich glaube, dass ich etwas schlauer bin - brauche aber dennoch eure Hilfe:

                                          Nachdem ich nun alle "input_select"-Entitäten deaktiviert habe, liesst er alles weitere wieder ein. Der Adapter scheint bei einem Fehler der definierten states im Datenpunkt einfach nicht mehr weiterzumachen und stürzt dann auch ab:

                                          lovelace.0
                                          	2021-11-11 17:39:03.623	warn	Terminated (UNCAUGHT_EXCEPTION): Without reason
                                          lovelace.0
                                          	2021-11-11 17:39:03.621	info	terminating
                                          lovelace.0
                                          	2021-11-11 17:39:03.618	info	cleaned everything up...
                                          lovelace.0
                                          	2021-11-11 17:39:03.550	error	Cannot read property 'low' of undefined
                                          lovelace.0
                                          	2021-11-11 17:39:03.549	error	TypeError: Cannot read property 'low' of undefined at fillEntityFromStates (/opt/iobroker/node_modules/iobroker.lovelace/lib/converters/input_select.js:47:92) at async /opt/iobroker/node_modules/iobroker.lovelace/lib/server.js:2860:42 at async Promise.all (index 4) at async Timeout._onTimeout (/opt/iobroker/node_modules/iobroker.lovelace/lib/server.js:2871:17)
                                          lovelace.0
                                          	2021-11-11 17:39:03.547	error	unhandled promise rejection: Cannot read property 'low' of undefined
                                          lovelace.0
                                          	2021-11-11 17:39:03.545	error	Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().
                                          

                                          Der definierte Test-Datenpunkt sieht so aus:

                                          {
                                            "common": {
                                              "name": "Test_Input",
                                              "desc": "Manuell erzeugt",
                                              "role": "state",
                                              "type": "string",
                                              "states": {
                                                "low": "low",
                                                "medium": "medium",
                                                "high": "high"
                                              },
                                              "read": true,
                                              "write": true,
                                              "def": "",
                                              "custom": {
                                                "lovelace.0": {
                                                  "enabled": true,
                                                  "entity": "input_select",
                                                  "name": "Test_Input"
                                                }
                                              }
                                            },
                                            "type": "state",
                                            "_id": "0_userdata.0.Test_Input",
                                            "acl": {
                                              "object": 1636,
                                              "state": 1636,
                                              "owner": "system.user.admin",
                                              "ownerGroup": "system.group.administrator"
                                            },
                                            "from": "system.adapter.admin.0",
                                            "user": "system.user.admin",
                                            "ts": 1636648064698
                                          }
                                          

                                          Wie muss denn das Objekt "states" aussehen, damit ich meine Auswahlmöglichkeiten wiederbekomme? Stehe da voll auf dem Schlauch...

                                          Danke für Hilfe!

                                          1 Reply Last reply Reply Quote 0
                                          • XBiT
                                            XBiT @Garfonso last edited by XBiT

                                            @garfonso

                                            Kannst du Infos zur Sichtbarkeit von Ansichten geben? Beitrag

                                            @xbit
                                            wenn du deine eigene Karte noch in der Visualisierung hast, ist das auch keine Überraschung. 🙂

                                            Es liegt ziemlich sicher an der Karte...

                                            Warum hat eine eigene erstellte Karte die die gleichen Datenpunkte abfragt Einfluss auf eine andere Karte?

                                            Beste Grüße

                                            Garfonso 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            704
                                            Online

                                            31.7k
                                            Users

                                            79.9k
                                            Topics

                                            1.3m
                                            Posts

                                            lovelace visualization
                                            78
                                            1514
                                            527504
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo