Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Praktische Anwendungen (Showcase)
    4. [Linux Shell-Skript] WLAN-Wetterstation

    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

    [Linux Shell-Skript] WLAN-Wetterstation

    This topic has been deleted. Only users with topic management privileges can see it.
    • a200
      a200 @Rene55 last edited by

      @rene55 sagte in [Linux Shell-Skript] WLAN-Wetterstation:

      @schittl @a200 @SBorg Ich habe gestern auch mal aufs Ecowitt-Protokoll umgeschaltet - es soll wohl das "bessere" sein. Leider vermisse ich dann ebenfalls (wie schon geschrieben) Chillfaktor und Taupunkt - die ich natürlich im Grafana-Dashboard drin habe. Dafür bekomme ich jetzt den Batteriestand. Ich würde gerne bei Ecowitt bleiben, wenn man den Chillfaktor und den Taupunkt irgendwie berchnet bekäme. Auch ich würde da gerne auf eine nächste Version warten.

      Bin dabei die beiden Punkte zu implementieren. Wann sie kommen hängt dann von Chef ( @SBorg) ab. 😉

      1 Reply Last reply Reply Quote 0
      • SBorg
        SBorg Forum Testing Most Active @schittl last edited by

        @schittl sagte in [Linux Shell-Skript] WLAN-Wetterstation:

        Bei Ecowitt meine ich die Anzeige im Portal. Da wird der Taupunkt ja angezeigt z.B.:

        Das ist auch nicht weiter verwunderlich. Eine "gefühlte Temperatur", "Taupunkt" usw. kann man nicht messen, sondern nur berechnen. Warum die Displays das nicht beim Ecowitt-Protokoll machen? Liegt wahrscheinlich daran, dass man die Daten bei WU/Ecowitt an ein PHP-Skript schickt. Da braucht es dann nur eine Formel im PHP-Skript und schon hat man bspw. die "gefühlte Temperatur": W = 13,12 + 0,6215 x T – 11,37 x V^0,16 + 0,3965 x T x V^0,16
        (man braucht also nichts weiter als die Temperatur und Windgeschwindigkeit)
        ...aber das können "wir" auch selbst im Skript erledigen... 😁

        ...und nehmt bitte gedanklich Abschied vom "Chillfaktor", die derzeitige Bezeichnung ist schlichtweg falsch. Dies ist die "gefühlte Temperatur", der "Chillfaktor" ist etwas gänzlich anderes 😉
        Mit der neuen Version wird es dann zukünftig korrekt "gefühlte Temperatur" lauten.

        @a200 sagte in [Linux Shell-Skript] WLAN-Wetterstation:

        Wann sie kommen hängt dann von Chef ( @SBorg) ab

        😁

        Negalein 1 Reply Last reply Reply Quote 1
        • Negalein
          Negalein Global Moderator @SBorg last edited by

          @sborg sagte in [Linux Shell-Skript] WLAN-Wetterstation:

          Chillfaktor

          da muss man ja schon studieren um das zu checken. 😂

          R 1 Reply Last reply Reply Quote 0
          • R
            Rand @Negalein last edited by

            @SBorg

            Hallo, habe kürzlich endlich meine Lieferung aus USA bekommen und möchte jetzt nach und nach mein GW1000 und die ganzen Sensoren einbinden.
            Habe also heute nach Github Anleitung das Skript installiert und passend zum GW1000 per WS View konfiguriert.

            Es scheinen auch Daten zu kommen welche allerdings nicht korrekt gelesen zu werden scheinen...

            ./wetterstation.sh --debug
            Connection to 192.168.y.z 8087 port [tcp/*] succeeded!
            Listening on 0.0.0.0 1080
            Connection received on 192.168.y.z 39356
            
            
            Messwerteblock:
            
            
            Nicht alle Werte werden unterstützt (abhängig vom Modell der Wetterstation und dem verwendeten Protokoll)!
            
            Temperatur Innen        :  °C
            Temperatur Aussen       :  °C
            Taupunkt                :  °C
            Chill-Faktor            :  °C
            Luftfeuchte Innen       :  %
            Luftfeuchte Aussen      :  %
            Windgeschwindkeit       :  km/h
            Windböengeschwindkeit   :  km/h
            max. Windböe            :  km/h
            Windrichtung            :  °
            Windrichtung            :
            Luftdruck absolut       :  hPa
            Luftdruck relativ       :  hPa
            Regenrate               :  mm/h
            Regenstatus             :
            Regen seit Regenbeginn  :  mm
            Regen Stunde            :  mm
            Regen Tag               :  mm
            Regen Woche             :  mm
            Regen Monat             :  mm
            Regen Jahr              :  mm
            Regen Gesamt            :  mm
            Sonnenstrahlung         :  W/m²
            UV-Index                :
            Zeitstempel             :
            Firmware                :
            Batteriestand:          :
            Gateway-Modell          :
            
            Zusatzsensoren:
            
            
            
            Datenstring für ioBroker:
            
            
            
            DATA von Wetterstation:
            PASSKEY=totalgeheim&stationtype=GW1000A_V1.6.3&dateutc=2019-08-22+08:25:11&tempinf=72.0&humidityin=54&baromrelin=28.928&baromabsin=28.928&freq=868M&model=GW1000_Pro
            
            
            Debug VAR:
            Installationsverzeichnis: /home/iobroker
            IPP: 192.168.y.z:8087        WS_PORT: 1080           WS_POLL: 30             PRE_DP: javascript.0.Wetterstation
            WEB: HTTP               WS_PROT: Ecowitt        DP50/100: 4 | 0
            Script-Version: V2.1.0  Config-Version: V2.1.0  Sub-Version: V2.1.0
            
            Kommunikationsfehler! Stimmt die WS_ID in der Konfiguration mit der der WS View-App überein?
            
            

            WS_ID kann ich in WS View nicht setzen da ich das Ecowitt Protokoll ausgewählt habe, an Sensoren habe ich nur einen WH31A (DP50) und das GW aktiv aktuell.
            Das Datum scheint noch nicht zu stimmen, aber ich nehme nicht an das das abgeglichen wird...

            Zwischenzeitlich hatte ich auch noch folgende Fehler:

            Connection to 192.168.y.z 8087 port [tcp/*] succeeded!
            Listening on 0.0.0.0 1080
            Connection received on 192.168.y.z 35888
            (standard_in) 12: syntax error
            /home/iobroker/wetterstation.sub: line 365: [: : integer expression expected
            /home/iobroker/wetterstation.sub: line 366: [: : integer expression expected
            /home/iobroker/wetterstation.sub: line 367: [: : integer expression expected
            /home/iobroker/wetterstation.sub: line 368: [: : integer expression expected
            /home/iobroker/wetterstation.sub: line 369: [: : integer expression expected
            
            

            Ich habe schon mal versucht im Thread herauszulesen ob denn der GW1000 überhaupt kompatibel ist aber konnte nichts genaues finden (ausser den Verweis auf die Node Red Alternative).
            Am Ende suche ich etwas was mit allen möglichen Sensoren läuft (inc Blitzsensor und Ultrasonic Windsensor) ... ist das mit dem Skript machbar oder wäre da die Node Red Lösung sinnvoller?

            Danke

            a200 1 Reply Last reply Reply Quote 0
            • a200
              a200 @Rand last edited by

              @rand Ich nutze auch die GW1000 mit der gleichen Firmware: GW1000A_V1.6.3 und einen DP50 dazu. Bei mir läuft alles und wir sollte es auch bei dir hinkriegen.

              Als erstes solltest du in der WS App die Zeitzone und den Hacken für Auto adjust.
              Live Data -> More -> Device Settings

              Wenn du nur einen DS50 hast, wieso hast du 4 konfiguriert?

              Wenn du das eingestellt hast, dann ändere in wetterstation.sub die Zeile: 221
              von
              if [ "$STRLEN" -gt "400" ] && [[ "$DATA" =~ "PASSKEY=" ]]; then return 0; else return 1; fi
              in
              if [ "$STRLEN" -gt "200" ] && [[ "$DATA" =~ "PASSKEY=" ]]; then return 0; else return 1; fi

              Mach also aus 400 eine 200

              Das sollte vorerst helfen.

              R 1 Reply Last reply Reply Quote 0
              • R
                Rand @a200 last edited by Rand

                @a200

                Hi,
                danke für die schnelle Antwort.
                Braucht Auto Adjust im GW einen Internetzugang? Da dürfte die FW im Weg stehen dann... Aber ich schaue mal 🙂

                DP50 - weil im Endausbau 4 Stück da sein werden, daher war ich bequem und habe das gleich mal konfiguriert.
                Wenn das allerdings Fehler verursacht dann passe ich das flugs an, das ist ja kein Thema...

                Edit - Autoadjust ist an (default), steht aber auf dem falschen Datum... das heisst er sucht irgendeinen Timeserver im Inet den er bei mir natürlich erstmal nicht erreicht...

                a200 1 Reply Last reply Reply Quote 0
                • a200
                  a200 @Rand last edited by

                  @rand Die WS braucht Zugang zu einem Timeserver und ohne Internet wird es schwierig sein. Es geht nur mit Tricks und DNS umleitung.

                  R 1 Reply Last reply Reply Quote 0
                  • R
                    Rand @a200 last edited by Rand

                    @a200

                    @a200 said in [Linux Shell-Skript] WLAN-Wetterstation:

                    @rand Die WS braucht Zugang zu einem Timeserver und ohne Internet wird es schwierig sein. Es geht nur mit Tricks und DNS umleitung.

                    DNS Umleitung wäre ja trivial wenn der Server bekannt ist?
                    Kann ich doch dann einfach an meinen eigenen NTP umleiten... mal das Log anschauen

                    Edit
                    Er versucht ne ganze Menge...
                    8df85b04-8a1a-4794-8bc8-9433dec9ca0f-image.png

                    a200 1 Reply Last reply Reply Quote 0
                    • a200
                      a200 @Rand last edited by

                      @rand sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                      @a200

                      @a200 said in [Linux Shell-Skript] WLAN-Wetterstation:

                      @rand Die WS braucht Zugang zu einem Timeserver und ohne Internet wird es schwierig sein. Es geht nur mit Tricks und DNS umleitung.

                      DNS Umleitung wäre ja trivial wenn der Server bekannt ist?
                      Kann ich doch dann einfach an meinen eigenen NTP umleiten... mal das Log anschauen

                      PiHole ist da ganz praktisch. Hast du den Wert auf 200 gesetzt?

                      R 1 Reply Last reply Reply Quote 0
                      • R
                        Rand @a200 last edited by Rand

                        @a200

                        PiHole ist da ganz praktisch. Hast du den Wert auf 200 gesetzt?

                        Ja, tut aber noch nicht.
                        Aber mag noch an der Zeit liegen

                        Edit

                        Connection received on 192.168.y.z10545
                        (standard_in) 12: syntax error
                        /home/iobroker/wetterstation.sub: line 365: [: : integer expression expected
                        /home/iobroker/wetterstation.sub: line 366: [: : integer expression expected
                        /home/iobroker/wetterstation.sub: line 367: [: : integer expression expected
                        /home/iobroker/wetterstation.sub: line 368: [: : integer expression expected
                        /home/iobroker/wetterstation.sub: line 369: [: : integer expression expect
                        

                        kommt auch noch

                        a200 1 Reply Last reply Reply Quote 0
                        • a200
                          a200 @Rand last edited by

                          @rand sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                          @a200

                          PiHole ist da ganz praktisch. Hast du den Wert auf 200 gesetzt?

                          Ja, tut aber noch nicht.
                          Aber mag noch an der Zeit liegen

                          Edit

                          Connection received on 192.168.y.z10545
                          (standard_in) 12: syntax error
                          /home/iobroker/wetterstation.sub: line 365: [: : integer expression expected
                          /home/iobroker/wetterstation.sub: line 366: [: : integer expression expected
                          /home/iobroker/wetterstation.sub: line 367: [: : integer expression expected
                          /home/iobroker/wetterstation.sub: line 368: [: : integer expression expected
                          /home/iobroker/wetterstation.sub: line 369: [: : integer expression expect
                          

                          kommt auch noch

                          das kommt, weil die Regenmenge nicht übertragen wird und auf der einige Berechnungen basieren. Wenn die Regenmenge kommt, dann verschwinden auch diese Fehler:

                          R 1 Reply Last reply Reply Quote 0
                          • R
                            Rand @a200 last edited by Rand

                            @a200 said in [Linux Shell-Skript] WLAN-Wetterstation:

                            das kommt, weil die Regenmenge nicht übertragen wird und auf der einige Berechnungen basieren. Wenn die Regenmenge kommt, dann verschwinden auch diese Fehler:

                            Ah ok, dann ignoriere ich das erstmal.

                            Zeit sieht etwas komplizierter aus bzw es gibt noch sekundäre "Probleme" mit der FW...
                            https://www.wxforum.net/index.php?topic=40437.msg417925#msg417925

                            Sieht so aus als müsste ich da erstmal etwas basteln.

                            R 1 Reply Last reply Reply Quote 0
                            • R
                              Rand @Rand last edited by

                              @a200
                              So, hat etwas gedauert bis ich die beiden FWs in Sync hatte für den NTP Redirect...

                              Musste Zeile 221 auch noch kleiner setzen da mit dem einen Sensor die Länge nur 185 Zeichen war

                              Datenstring für ioBroker:
                              javascript.0.Wetterstation.Innentemperatur=22.50&javascript.0.Wetterstation.Innenfeuchtigkeit=55&javascript.0.Wetterstation.Druck_absolut=978.09&javascript.0.Wetterstation.Druck_relativ=978.09&javascript.0.Wetterstation.Zeitstempel=21.01.2021%2000:18:58&javascript.0.Wetterstation.Info.FW_Version=GW1000A_V1.6.3&javascript.0.Wetterstation.Info.Wetterstation_Gateway=GW1000_Pro&javascript.0.Wetterstation.Regenstatus=&javascript.0.Wetterstation.UV_Belastung=&javascript.0.Wetterstation.Windrichtung_Text=
                              
                              
                              DATA von Wetterstation:
                              PASSKEY=SECRET&stationtype=GW1000A_V1.6.3&dateutc=2021-01-20+23:18:58&tempinf=72.5&humidityin=55&baromrelin=28.883&baromabsin=28.883&freq=868M&model=GW1000_Pro
                              
                              
                              Debug VAR:
                              Installationsverzeichnis: /home/iobroker
                              IPP: 192.168.y.z:8087        WS_PORT: 1080           WS_POLL: 30             PRE_DP: javascript.0.Wetterstation
                              WEB: HTTP               WS_PROT: Ecowitt        DP50/100: 1 | 0
                              Script-Version: V2.1.0  Config-Version: V2.1.0  Sub-Version: V2.1.0
                              
                              

                              Sieht ja schon mal ganz gut aus, danke sehr.
                              Funktionieren alle bekannten/verfügbaren 868MhZ Sensoren mit dem Skript oder sind da noch welche zu implementieren?

                              SBorg 1 Reply Last reply Reply Quote 0
                              • A
                                amiethaner last edited by

                                ich komm hier noch ned ganz klar... wie kann ich denn innerhalb des Freds hier suchen?
                                Meine DNT zeigt mir am Display die richtige uhrzeit an - 06:58 die Daten kommen aber mit dem Zeitstempel 05:58 an.
                                Kann ich das iwie / iwo ändern?

                                Glasfaser a200 2 Replies Last reply Reply Quote 0
                                • Glasfaser
                                  Glasfaser @amiethaner last edited by

                                  @amiethaner sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                                  wie kann ich denn innerhalb des Freds hier suchen?

                                  In User Einstellung aktivieren :

                                  1.JPG

                                  STRG + F

                                  2.JPG

                                  A 1 Reply Last reply Reply Quote 0
                                  • A
                                    amiethaner @Glasfaser last edited by

                                    @glasfaser sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                                    @amiethaner sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                                    wie kann ich denn innerhalb des Freds hier suchen?

                                    In User Einstellung aktivieren :

                                    1.JPG

                                    STRG + F

                                    2.JPG

                                    Danke dir! Dann muss ich evtl manche Frage ned zum 1000, mal stellen hier

                                    1 Reply Last reply Reply Quote 0
                                    • B
                                      banza last edited by

                                      Frage zum Statistik-Script, ich möchte mir die Rekordwerte mit Tag anzeigen lassen, laut Skript müsste die Zeile

                                      let REKORDWERTE_AUSGABEFORMAT="[WERT] im [MONAT] [JAHR]"; 
                                      

                                      mit [TAG] ergänzt werden. Der Datenpunkt wird dann aber so geschrieben: 9.88 °C am [Tag] Januar 2021

                                      und das Log zeigt folgendes:

                                      2021-01-21 01:03:00.287 - warn: javascript.0 (23874) You are assigning a number to the state "0_userdata.0.Wetterstation.Statistik.Rekordwerte.Temperatur_Spitzenhoechstwert" which expects a string. Please fix your code to use a string or change the state type to number. This warning might become an error in future versions.
                                      2021-01-21 01:03:00.290 - warn: javascript.0 (23874) at setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1416:20)
                                      2021-01-21 01:03:00.291 - warn: javascript.0 (23874) at Rekordwerte (script.js.common.wetterstation-statistik:562:9)
                                      2021-01-21 01:03:00.291 - warn: javascript.0 (23874) at Object.cb (script.js.common.wetterstation-statistik:265:5)
                                      2021-01-21 01:03:00.292 - warn: javascript.0 (23874) at change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:5297:71)
                                      2021-01-21 01:03:00.292 - warn: javascript.0 (23874) at Immediate.setImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:234:41)
                                      2021-01-21 01:03:00.293 - warn: javascript.0 (23874) at runCallback (timers.js:705:18)
                                      2021-01-21 01:03:00.293 - warn: javascript.0 (23874) at tryOnImmediate (timers.js:676:5)
                                      2021-01-21 01:03:00.293 - warn: javascript.0 (23874) at processImmediate (timers.js:658:5)
                                      2021-01-21 01:03:00.294 - warn: javascript.0 (23874) at process.topLevelDomainCallback (domain.js:126:23)
                                      2021-01-21 01:03:05.501 - warn: influxdb.0 (23336) Error on writePoint("{"value":"9.88 °C am [Tag] Januar 2021","time":"2021-01-21T00:03:05.341Z","from":"system.adapter.javascript.0","q":0,"ack":true}): Error: {"error":"partial write: field type conflict: input field \"value\" on measurement \"0_userdata.0.Wetterstation.Statistik.Rekordwerte.Temperatur_Spitzenhoechstwert\" is type string, already exists as type float dropped=1"}
                                      / "{\"error\":\"partial write: field type conflict: input field \\\"value\\\" on measurement \\\"0_userdata.0.Wetterstation.Statistik.Rekordwerte.Temperatur_Spitzenhoechstwert\\\" is type string, already exists as type float dropped=1\"}\n"
                                      2021-01-21 01:03:05.510 - warn: influxdb.0 (23336) Add 0_userdata.0.Wetterstation.Statistik.Rekordwerte.Temperatur_Spitzenhoechstwert to conflicting Points (1 now)
                                      
                                      SBorg 1 Reply Last reply Reply Quote 0
                                      • a200
                                        a200 @amiethaner last edited by

                                        @amiethaner sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                                        ich komm hier noch ned ganz klar... wie kann ich denn innerhalb des Freds hier suchen?
                                        Meine DNT zeigt mir am Display die richtige uhrzeit an - 06:58 die Daten kommen aber mit dem Zeitstempel 05:58 an.
                                        Kann ich das iwie / iwo ändern?

                                        1. Was zeigt dein wetterstation.sh --debug?
                                        2. Hast du in der WS-App die richtige Zeitzone ausgewählt?
                                        3. Hat dein Rechner auf dem wetterstation.sh läuft die richtige Uhrzeit?

                                        Je nachdem (WS, Firmware, Protokoll) wird die Uhrzeit unterschiedlich übertragen (Timestamp in unterschiedlichen Variationen, now, u.ä.). Aber das kann man aus den Debug-Daten sehen.

                                        A 1 Reply Last reply Reply Quote 0
                                        • A
                                          amiethaner @a200 last edited by

                                          @a200 sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                                          @amiethaner sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                                          ich komm hier noch ned ganz klar... wie kann ich denn innerhalb des Freds hier suchen?
                                          Meine DNT zeigt mir am Display die richtige uhrzeit an - 06:58 die Daten kommen aber mit dem Zeitstempel 05:58 an.
                                          Kann ich das iwie / iwo ändern?

                                          1. Was zeigt dein wetterstation.sh --debug?
                                          2. Hast du in der WS-App die richtige Zeitzone ausgewählt?
                                          3. Hat dein Rechner auf dem wetterstation.sh läuft die richtige Uhrzeit?

                                          Je nachdem (WS, Firmware, Protokoll) wird die Uhrzeit unterschiedlich übertragen (Timestamp in unterschiedlichen Variationen, now, u.ä.). Aber das kann man aus den Debug-Daten sehen.

                                          Zeit, Zeitzone, autom. Sync (funktioniert) und autom. Sommerzeit sind eingestellt. Am PC passt auch alles, aber im Debug sieht man das es dort auch "falsch" kommt.
                                          Kann es sein das die Station UTC sendet, und dur das Display und WU usw das umrechnet?

                                          a200 SBorg 2 Replies Last reply Reply Quote 0
                                          • a200
                                            a200 @amiethaner last edited by

                                            @amiethaner sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                                            @a200 sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                                            @amiethaner sagte in [Linux Shell-Skript] WLAN-Wetterstation:

                                            ich komm hier noch ned ganz klar... wie kann ich denn innerhalb des Freds hier suchen?
                                            Meine DNT zeigt mir am Display die richtige uhrzeit an - 06:58 die Daten kommen aber mit dem Zeitstempel 05:58 an.
                                            Kann ich das iwie / iwo ändern?

                                            1. Was zeigt dein wetterstation.sh --debug?
                                            2. Hast du in der WS-App die richtige Zeitzone ausgewählt?
                                            3. Hat dein Rechner auf dem wetterstation.sh läuft die richtige Uhrzeit?

                                            Je nachdem (WS, Firmware, Protokoll) wird die Uhrzeit unterschiedlich übertragen (Timestamp in unterschiedlichen Variationen, now, u.ä.). Aber das kann man aus den Debug-Daten sehen.

                                            Zeit, Zeitzone, autom. Sync (funktioniert) und autom. Sommerzeit sind eingestellt. Am PC passt auch alles, aber im Debug sieht man das es dort auch "falsch" kommt.
                                            Kann es sein das die Station UTC sendet, und dur das Display und WU usw das umrechnet?

                                            Das kann ich dir sagen, wenn ich sehe, was die WS sendet. Wenn sie "now" schickt, dann ist es schon i.O. Anderenfalls muss noch UCT umgerechnet werden. Siehe wetterstation.sub Ab Zeile 295

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            506
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            linux shell-script wetterstation wlan-wetterstation
                                            143
                                            5478
                                            3288826
                                            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