Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Node-Red
    5. Einfache Steuerung Steckdose/Temperatur

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Einfache Steuerung Steckdose/Temperatur

    This topic has been deleted. Only users with topic management privileges can see it.
    • Seb K.
      Seb K. last edited by

      Hallo freunde, ich bin ganz neu in der ioBroker Gemeinschaft und frage mich ob und wie es möglich ist eine einfach Steuerung mit folgenden Komponenten zu verknüpfen .

      Wir haben einen Pool mit einer 3KW Poolheizung welche über eine Gesund Tasmota geflashte Steckdose ein und ausgeschaltet wird.

      Nun möchten wir dieses gerne automatisieren. eine Sonoff TH16 ist bereits vorhanden und liefert die Pooltemperaturen.

      Wir möchten in der Visualisierung einen Sollwert eingeben und wenn dieser erreicht ist soll die Steckdose ausschalten. wenn dieser wieder unterschritten wird dann ebend wieder Strom auf die Gosund. ist das so schwer zu relaisieren ??

      vieleicht kann ja jemand helfen.

      Besten dank im Vorraus

      1 Reply Last reply Reply Quote 0
      • H
        Hc-Yami last edited by

        Die größere Baustelle ist die Visualisierung. Wären fixe Werte nicht in Ordnung? Weiterhin; warum noch die Steckdose nutzen wenn du eh schon den TH16 im Einsatz hast?

        1 Reply Last reply Reply Quote 0
        • Seb K.
          Seb K. last edited by

          Der th16 kann nur 10A schalten.

          Wären ja dann fixe Werte wenn ich die in der Vis mittels Regler einstelle .

          Oder wie meinst du das?

          CrunkFX 1 Reply Last reply Reply Quote 0
          • CrunkFX
            CrunkFX Forum Testing @Seb K. last edited by

            @Seb-K Muss die Steuerung denn mit Node-Red erfolgen? Node-Red ist zum verknüpfen eine super Software aber für solche vorhaben recht ungeeignet. Ich würde dir sonst anbieten, dass wir einen Script mit Blockly oder Javascript schreiben der die Anlage dann auch mit dynamischen Werten steuern kann.

            MFG
            CrunkFX

            Seb K. 1 Reply Last reply Reply Quote 0
            • Seb K.
              Seb K. @CrunkFX last edited by

              @CrunkFX Hey super gerne,

              allerdings habe ich das Problem Java zu installieren..... und soweit ich weiß ist das zwingen für Blocky notwendig oder?

              CrunkFX 2 Replies Last reply Reply Quote 0
              • CrunkFX
                CrunkFX Forum Testing @Seb K. last edited by

                @Seb-K Versuch mal in IOB den Javascript Adapter zu installieren. Dann sollten alle dependencies automatisch mitinstalliert werden.

                1 Reply Last reply Reply Quote 0
                • CrunkFX
                  CrunkFX Forum Testing @Seb K. last edited by

                  @Seb-K Falls bei dir die Installation klappt gehst du wie folgt vor:

                  1. Im ObjektBrowser unter Userdata.0 einen neuen Datenpunkt als Zahl anlegen, der deine Wunschtemperatur wird.

                  2. Ich gehe davon aus, dass die Werte für Temp im TH16 als Zahl angelegt werden. Falls nicht ändern wir nochmal was.
                    Dann also ein neues Blockly Script anlegen und oben rechts auf Importieren gehen:

                   <xml xmlns="http://www.w3.org/1999/xhtml">
                    <block type="on_ext" id="W1ukkv8+-RJ^m%krfUK6" x="37" y="37">
                      <mutation items="1"></mutation>
                      <field name="CONDITION">ne</field>
                      <field name="ACK_CONDITION"></field>
                      <value name="OID0">
                        <shadow type="field_oid" id="Q?7Bcztc=QdB~m}3^dbc">
                          <field name="oid">default</field>
                        </shadow>
                        <block type="get_value" id="~8pkp]f@pXX1@CQ.IY2,">
                          <field name="ATTR">val</field>
                          <field name="OID">0_userdata.0.dein_TH16_Temp_DP</field>
                        </block>
                      </value>
                      <statement name="STATEMENT">
                        <block type="controls_if" id="2kqxJ}$lU85L!ft-/kxE">
                          <value name="IF0">
                            <block type="logic_compare" id="rkTXol`rxf/1q~i@Kjaa">
                              <field name="OP">LT</field>
                              <value name="A">
                                <block type="get_value" id="G?=^}GmR84glD`Zi+tQb">
                                  <field name="ATTR">val</field>
                                  <field name="OID">0_userdata.0.dein_TH16_Temp_DP</field>
                                </block>
                              </value>
                              <value name="B">
                                <block type="math_arithmetic" id="lHTnf(PKJk%5BAS^.du3">
                                  <field name="OP">MINUS</field>
                                  <value name="A">
                                    <shadow type="math_number" id="Iqlpl#{S5S}bv]mWtT]P">
                                      <field name="NUM">1</field>
                                    </shadow>
                                    <block type="get_value" id="^.{.Qf.FXqJR.dskU*;X">
                                      <field name="ATTR">val</field>
                                      <field name="OID">0_userdata.0.deine_Wunschtemperatur</field>
                                    </block>
                                  </value>
                                  <value name="B">
                                    <shadow type="math_number" id="`$v%dB0EWl]qrkcsdAuz">
                                      <field name="NUM">0.2</field>
                                    </shadow>
                                  </value>
                                </block>
                              </value>
                            </block>
                          </value>
                          <statement name="DO0">
                            <block type="control" id="@]0_0[C?0^jLax0O%*%7">
                              <mutation delay_input="false"></mutation>
                              <field name="OID">0_userdata.0.deine_Gosund_Steckdose</field>
                              <field name="WITH_DELAY">FALSE</field>
                              <value name="VALUE">
                                <block type="logic_boolean" id="~C/-P,sOktY:cG4{H;oz">
                                  <field name="BOOL">TRUE</field>
                                </block>
                              </value>
                            </block>
                          </statement>
                          <next>
                            <block type="controls_if" id="YNr;-AsS@8l|_wD(q9Qw">
                              <value name="IF0">
                                <block type="logic_compare" id="C$EOUzST`sN/Y5{=MH6-">
                                  <field name="OP">GT</field>
                                  <value name="A">
                                    <block type="get_value" id="t;-XAAJ@NVUG8/K%]xE*">
                                      <field name="ATTR">val</field>
                                      <field name="OID">0_userdata.0.dein_TH16_Temp_DP</field>
                                    </block>
                                  </value>
                                  <value name="B">
                                    <block type="math_arithmetic" id="8$B;`_}JFe$$a^Rz5Lv7">
                                      <field name="OP">ADD</field>
                                      <value name="A">
                                        <shadow type="math_number" id="Iqlpl#{S5S}bv]mWtT]P">
                                          <field name="NUM">1</field>
                                        </shadow>
                                        <block type="get_value" id="xx]3:*!$^s9o5)9/|LPM">
                                          <field name="ATTR">val</field>
                                          <field name="OID">0_userdata.0.deine_Wunschtemperatur</field>
                                        </block>
                                      </value>
                                      <value name="B">
                                        <shadow type="math_number" id="4`$HIlisil=:DXC8S%hM">
                                          <field name="NUM">0.2</field>
                                        </shadow>
                                      </value>
                                    </block>
                                  </value>
                                </block>
                              </value>
                              <statement name="DO0">
                                <block type="control" id="n|N[iCG$i]0?9TeM_~K6">
                                  <mutation delay_input="false"></mutation>
                                  <field name="OID">0_userdata.0.deine_Gosund_Steckdose</field>
                                  <field name="WITH_DELAY">FALSE</field>
                                  <value name="VALUE">
                                    <block type="logic_boolean" id="S4SCo58|12bec#+nx8Me">
                                      <field name="BOOL">TRUE</field>
                                    </block>
                                  </value>
                                </block>
                              </statement>
                            </block>
                          </next>
                        </block>
                      </statement>
                    </block>
                  </xml>
                  

                  In Blockly lässt sich leider keine anständige Hysterese einbauen, daher hab ich für min und max einen Offset von 0,2 angesetzt. Das funktioniert bei unserer Fußbodenheizung super. Damit soll verhindert werden, dass die Pumpe und Ventile ständig schnell hintereinander schalten.

                  In VIS kannst du dann einen Slider o.ä bauen mit dem du dann die Wunschtemperatur anpassen kannst.

                  Bei Rückfragen stehe ich gerne zur Verfügung.

                  MFG CrunkFX

                  1 Reply Last reply Reply Quote 0
                  • Seb K.
                    Seb K. last edited by

                    @CrunkFX said in Einfache Steuerung Steckdose/Temperatur:

                    rowser unter Us

                    ich installiere jetzt erstmal iobroker auf nem neuem system und dann teste ich noch mal JS

                    CrunkFX 1 Reply Last reply Reply Quote 0
                    • CrunkFX
                      CrunkFX Forum Testing @Seb K. last edited by

                      @Seb-K OK welche Plattform nutzt du?

                      1 Reply Last reply Reply Quote 0
                      • Seb K.
                        Seb K. last edited by

                        debian auf einem Thin PC

                        CrunkFX 1 Reply Last reply Reply Quote 0
                        • CrunkFX
                          CrunkFX Forum Testing @Seb K. last edited by

                          @Seb-K OK damit sollte es auf jeden Fall klappen

                          1 Reply Last reply Reply Quote 0
                          • Seb K.
                            Seb K. last edited by

                            ich installiere erstmal alles und melde mich nochmal. bisher erst einmal besten dank

                            1 Reply Last reply Reply Quote 0
                            • mickym
                              mickym Most Active last edited by

                              Ich verstehe nicht, warum manche hier was Blockly oder Java Schript schreiben in einem Thread wo nach einer Node-Red Lösung gefragt wird. Für solche Probleme - die man soweit ich weiß Hysterese genannt werden - kann man sogar im Node-Red fertige Lösungen installieren und muss quasi nichts programmieren.

                              Ich denke - dass man hier sicher selbst einen Flow basteln kann, aber es gibt auch einen Node / Modul, dass man ausprobieren kann:

                              https://flows.nodered.org/node/node-red-contrib-hysteresis

                              CrunkFX 1 Reply Last reply Reply Quote 0
                              • CrunkFX
                                CrunkFX Forum Testing @mickym last edited by

                                @mickym Wie du vielleicht mitbekommen hast sollte die Hysterese dynamisch gestaltet werden, ich hab jahrelang nodered benutzt und bin mir darüber im Klaren, dass das eine super Software ist, aber das verarbeiten von variablen aus anderen Quellen z.b. Datenpunkte in IOBroker ist mehr ein workaround als hilfreich. Ich lasse mich aber gerne eines besseren belehren, wenn du mir hier nen Flow postest der eine dynamische Hysterese ermöglicht.

                                MFG
                                CrunkFX

                                mickym 1 Reply Last reply Reply Quote 0
                                • mickym
                                  mickym Most Active @CrunkFX last edited by mickym

                                  @CrunkFX

                                  ...aber das verarbeiten von variablen aus anderen Quellen z.b. Datenpunkte in IOBroker ist mehr ein workaround als hilfreich. - was ich an dem Satz nicht verstehe ist, dass Du doch nahezu auf alle Datenpunkte im IOBroker (mal abgesehen von den Systemdaten) zugreifen kannst. Ok man muss oft noch eine Typkonvertierung ggf. durchführen.

                                  Man kann z.Bsp um Levels dynamisch zu starten - die Hysterese als Subflow implementieren.

                                  [
                                      {
                                          "id": "2963f527.4194ba",
                                          "type": "switch",
                                          "z": "b42815ec.5e6c58",
                                          "name": "fLevel.On < Temperatur > fLevel.Off",
                                          "property": "payload",
                                          "propertyType": "msg",
                                          "rules": [
                                              {
                                                  "t": "lt",
                                                  "v": "fLevel.On",
                                                  "vt": "flow"
                                              },
                                              {
                                                  "t": "gt",
                                                  "v": "fLevel.Off",
                                                  "vt": "flow"
                                              },
                                              {
                                                  "t": "lte",
                                                  "v": "fLevel.Off",
                                                  "vt": "flow"
                                              }
                                          ],
                                          "checkall": "false",
                                          "repair": false,
                                          "outputs": 3,
                                          "x": 560,
                                          "y": 100,
                                          "wires": [
                                              [],
                                              [],
                                              []
                                          ]
                                      }
                                  ]
                                  

                                  Zum Initialisieren bzw. Verändern der Levels schicke ich ein Nachrichten-Objekt in dem ich das untere und ober Level setzen kann.

                                  In dem Beispiel:

                                  msg.level -
                                  Objekt mit On und Off - als nummerische Werte, um die Standardlevels von 10 (level.On) und 20 (level.Off) zu überschreiben.

                                  Bei mir sieht das Ganze komplexer aus - aber ich denke das Prinzip kann man erkennen:

                                  screen.png

                                  Insofern find ich das eigentlich super einfach - gerade für jemand der nicht programmiert. 😉

                                  Die Verzögerung habe ich nur gebaut - damit man Initialisierung und Veränderungen von aktuellen Daten unterschiedlich behandeln kann.

                                  Das was Du mit eigenem Datenpunkt unter userdata.0 zu erstellen für die VIS ist ja völlig richtig und würde ich auch so machen. 🙂

                                  Im Prinzip ist es eigentlich noch einfacher - als ich eben dargestellt habe. Man kann die in userdata.0 erstellten Datenpunkte eigenlich direkt einlesen und dann in flow Variablen abspeichern und somit ist das Ganze eigentlich schon erledigt und dynamisiert!

                                  Ob man die Spanne zwischen oben oder unterem Level dann verarbeiten will - bleibt freigestellt, dann eben diesen Fall im Switch löschen.

                                  Und wenn man die Level in den userdata-Punkten dynamisch berechnen will - kann man dies ja mathematisch mit einer Function-Node machen oder einer Change-Node. Dann stelle ich halt eine Temperatur ein und setze die flow-Variablen eben nach Berechnung, wenn userdata.0.temperatur geändert wurde.
                                  Wenn Du kein VIS nutzt, sondern das Node-Red Dashboard - kannst natürlich auch die Flow Variablen direkt setzen - muss man halt nur initialisieren.

                                  Ansonsten wird der Flow ja einfach mit den Temperaturen der Sonoff TH16 gespeist.

                                  CrunkFX 1 Reply Last reply Reply Quote 0
                                  • CrunkFX
                                    CrunkFX Forum Testing @mickym last edited by

                                    @mickym Hi, deinen Ansatz finde ich sehr gut und verstehe deine Argumente für Node-Red, aber für jemanden der wenig bis gar keine Erfahrung in NodeRed hat sind das komplett böhmische Dörfer. Die hier zu bewältigende Aufgabe ist Technisch gesehen nicht sonderlich Komplex, aber in Blockly(trotz grauenvoller Übersetzung) einfacher zu Realisieren als in NodeRed, da Blockly Baukastentechnisch Arbeitet und Nodered Flow basiert. Wenn man also ganz frisch jemandem Nodered beibringen muss, dann sollte die Anfangsaufgabe keine Mammutaufgabe sein. Wenn hier jemand mit entsprechender Nodered Erfahrung dieses Problem gestellt hätte wäre ich sicher drauf eingegangen. Nichts desto trotz bleibt jedem selbst überlassen wie er seine Probleme löst, Nodered ist wie gesagt eine Super Software auch für Anfänger aber gerade bei Beispielen in denen mit Flow Messages gearbeitet wird(sprich man sieht nicht was passiert, da der Wert ja unsichtbar im Flow verteilt wird) könnte ich mir Vorstellen, dass da nicht jeder auf anhieb den durchblick hat sowie bei Blockly.

                                    MFG
                                    CrunkFX

                                    mickym 1 Reply Last reply Reply Quote 0
                                    • mickym
                                      mickym Most Active @CrunkFX last edited by mickym

                                      @CrunkFX
                                      Ich habe mal Dein Blockly Skript importiert und versucht in Node-Red umzusetzen:

                                      [
                                          {
                                              "id": "9f04b667.5cd998",
                                              "type": "tab",
                                              "label": "Flow 2",
                                              "disabled": false,
                                              "info": ""
                                          },
                                          {
                                              "id": "3bcbf948.4c3446",
                                              "type": "ioBroker in",
                                              "z": "9f04b667.5cd998",
                                              "name": "",
                                              "topic": "0_userdata.0.dein_TH16_Temp_DP",
                                              "payloadType": "value",
                                              "onlyack": "",
                                              "func": "all",
                                              "gap": "",
                                              "x": 230,
                                              "y": 200,
                                              "wires": [
                                                  [
                                                      "9deba34c.8a806"
                                                  ]
                                              ]
                                          },
                                          {
                                              "id": "9deba34c.8a806",
                                              "type": "change",
                                              "z": "9f04b667.5cd998",
                                              "name": "to Number",
                                              "rules": [
                                                  {
                                                      "t": "set",
                                                      "p": "payload",
                                                      "pt": "msg",
                                                      "to": "$number(msg.payload)\t",
                                                      "tot": "jsonata"
                                                  }
                                              ],
                                              "action": "",
                                              "property": "",
                                              "from": "",
                                              "to": "",
                                              "reg": false,
                                              "x": 470,
                                              "y": 200,
                                              "wires": [
                                                  [
                                                      "79074a2f.e315f4",
                                                      "79a6662f.b72558"
                                                  ]
                                              ]
                                          },
                                          {
                                              "id": "79074a2f.e315f4",
                                              "type": "change",
                                              "z": "9f04b667.5cd998",
                                              "name": "Level Oben + 0.2",
                                              "rules": [
                                                  {
                                                      "t": "set",
                                                      "p": "payload",
                                                      "pt": "msg",
                                                      "to": "payload + 0.2",
                                                      "tot": "jsonata"
                                                  },
                                                  {
                                                      "t": "set",
                                                      "p": "LevelOff",
                                                      "pt": "flow",
                                                      "to": "payload",
                                                      "tot": "msg"
                                                  }
                                              ],
                                              "action": "",
                                              "property": "",
                                              "from": "",
                                              "to": "",
                                              "reg": false,
                                              "x": 690,
                                              "y": 180,
                                              "wires": [
                                                  []
                                              ]
                                          },
                                          {
                                              "id": "79a6662f.b72558",
                                              "type": "change",
                                              "z": "9f04b667.5cd998",
                                              "name": "Level Unten - 0.2",
                                              "rules": [
                                                  {
                                                      "t": "set",
                                                      "p": "payload",
                                                      "pt": "msg",
                                                      "to": "payload - 0.2",
                                                      "tot": "jsonata"
                                                  },
                                                  {
                                                      "t": "set",
                                                      "p": "LevelOn",
                                                      "pt": "flow",
                                                      "to": "payload",
                                                      "tot": "msg"
                                                  }
                                              ],
                                              "action": "",
                                              "property": "",
                                              "from": "",
                                              "to": "",
                                              "reg": false,
                                              "x": 690,
                                              "y": 220,
                                              "wires": [
                                                  []
                                              ]
                                          },
                                          {
                                              "id": "a3f4a48c.5fbea8",
                                              "type": "inject",
                                              "z": "9f04b667.5cd998",
                                              "name": "",
                                              "topic": "Temperatur",
                                              "payload": "19",
                                              "payloadType": "str",
                                              "repeat": "",
                                              "crontab": "",
                                              "once": false,
                                              "onceDelay": 0.1,
                                              "x": 150,
                                              "y": 360,
                                              "wires": [
                                                  [
                                                      "200998b7.04c3e8"
                                                  ]
                                              ]
                                          },
                                          {
                                              "id": "200998b7.04c3e8",
                                              "type": "change",
                                              "z": "9f04b667.5cd998",
                                              "name": "to Number",
                                              "rules": [
                                                  {
                                                      "t": "set",
                                                      "p": "payload",
                                                      "pt": "msg",
                                                      "to": "$number(msg.payload)\t",
                                                      "tot": "jsonata"
                                                  }
                                              ],
                                              "action": "",
                                              "property": "",
                                              "from": "",
                                              "to": "",
                                              "reg": false,
                                              "x": 310,
                                              "y": 360,
                                              "wires": [
                                                  [
                                                      "60e1c1db.31561"
                                                  ]
                                              ]
                                          },
                                          {
                                              "id": "60e1c1db.31561",
                                              "type": "switch",
                                              "z": "9f04b667.5cd998",
                                              "name": "Schalte",
                                              "property": "payload",
                                              "propertyType": "msg",
                                              "rules": [
                                                  {
                                                      "t": "gt",
                                                      "v": "LevelOff",
                                                      "vt": "flow"
                                                  },
                                                  {
                                                      "t": "lt",
                                                      "v": "LevelOn",
                                                      "vt": "flow"
                                                  }
                                              ],
                                              "checkall": "true",
                                              "repair": false,
                                              "outputs": 2,
                                              "x": 460,
                                              "y": 360,
                                              "wires": [
                                                  [
                                                      "775acae7.a07974"
                                                  ],
                                                  [
                                                      "c65452e7.c57c8"
                                                  ]
                                              ]
                                          },
                                          {
                                              "id": "775acae7.a07974",
                                              "type": "change",
                                              "z": "9f04b667.5cd998",
                                              "name": "Ausschalten Off/False",
                                              "rules": [
                                                  {
                                                      "t": "set",
                                                      "p": "payload",
                                                      "pt": "msg",
                                                      "to": "false",
                                                      "tot": "bool"
                                                  }
                                              ],
                                              "action": "",
                                              "property": "",
                                              "from": "",
                                              "to": "",
                                              "reg": false,
                                              "x": 700,
                                              "y": 340,
                                              "wires": [
                                                  [
                                                      "184ff99a.c85ca6"
                                                  ]
                                              ]
                                          },
                                          {
                                              "id": "c65452e7.c57c8",
                                              "type": "change",
                                              "z": "9f04b667.5cd998",
                                              "name": "Einschalten On/true",
                                              "rules": [
                                                  {
                                                      "t": "set",
                                                      "p": "payload",
                                                      "pt": "msg",
                                                      "to": "true",
                                                      "tot": "bool"
                                                  }
                                              ],
                                              "action": "",
                                              "property": "",
                                              "from": "",
                                              "to": "",
                                              "reg": false,
                                              "x": 690,
                                              "y": 380,
                                              "wires": [
                                                  [
                                                      "184ff99a.c85ca6"
                                                  ]
                                              ]
                                          },
                                          {
                                              "id": "184ff99a.c85ca6",
                                              "type": "ioBroker out",
                                              "z": "9f04b667.5cd998",
                                              "name": "zur Steckdose",
                                              "topic": "",
                                              "ack": "false",
                                              "autoCreate": "false",
                                              "x": 980,
                                              "y": 360,
                                              "wires": []
                                          }
                                      ]
                                      

                                      Das sieht dann so aus:

                                      screen.png

                                      Und ich will niemand bekehren, aber doch vielleicht auch Alternativen aufzeigen.

                                      Das wäre in meinen Augen das, was Du mit dem Blockly machst - ich habe mir das extra mal importiert. 😉

                                      Ich persönlich mag dieses Flow basierende, da es gerade für Neulinge einfacher zu verstehen ist, was passiert wenn ....
                                      Im Übrigen wird man eben auch gezwungen zu unterscheiden, was sind "Parameter" Flows oder dann "Schalter" Flows. Ich finde, dass man hier "erzogen" wird, die Probleme richtig zu strukturieren - deshalb bin ich halt ein kleiner Fan-Boy von Node-Red. Man möge mir das Nachsehen.

                                      Statt dem Inject Node - für die Temperatur natürlich den Datenpunkt der Sonoff setzen und analog zu oben in Zahl konvertieren und natürlich den Datenpunkt zur Steckdose anpassen und ob True/False oder 0/1 oder On/Off gesetzt werden muss.

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

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate

                                      1.1k
                                      Online

                                      31.7k
                                      Users

                                      79.7k
                                      Topics

                                      1.3m
                                      Posts

                                      4
                                      17
                                      1872
                                      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