Ankündigung

Einklappen
Keine Ankündigung bisher.

RasPi: (CPU) Temperatur aufzeichnen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    RasPi: (CPU) Temperatur aufzeichnen

    Hallo zusammen,




    da die Wetterlage nennen wir es mal bescheiden ist… habe ich es mal angegangen. Der RasPi ist nun in sein Gehäuse gezogen.

    Aus Neugierde habe ich mal die Temperatur ausgelesen.

    Befehl:

    Code:
    vcgencmd measure_temp
    Code:
    while endless=0; do echo `date +%c` Uhr: `vcgencmd measure_temp`; sleep 30; done ~/temperatur.txt
    Nun gibt es auch diverse Tipps diese Temperaturen zu speichern, wäre es auch möglich, die RasPi-Temp in SHNG/SmartVISU zu verwenden? Da dort schon ein plot für jeden Raum sowie die Außentemperatur besteht.







    Danke

    #2
    Du kannst in einer Logik die Datei /sys/class/thermal/thermal_zone0/temp auslesen und erhältst die Temperatur in milligrad celsius, z.B. auf meinem NUC

    Code:
    smarthome@sh11:~$ cat /sys/class/thermal/thermal_zone0/temp
    39000
    Entspricht also 39 °C

    Kommentar


      #3
      Du meinst hier (Admin Interface Logics) eine neue Logik "RPi-Temp-lesen"


      #!/usr/bin/env python3
      # logics/example_logging.py

      # Diese Beispiel-Logik zeigt, wie Logeinträge verschiedener Levels in die Logdateien eingetragen werden.
      #
      # Dazu:
      # - Diese Logik triggern
      # - die Einträge in ../var/log/smarthome-warnings.log und ../var/log/smarthome-details.log prüfen

      logger.warning("Logik '{}' (filename '{}') wurde getriggert (WARNING)".format(logic.name, logic.filename))
      logger.info("Logik '{}' (filename '{}') wurde getriggert (INFO)".format(logic.name, logic.filename))
      logger.debug("Logik '{}' (filename '{}') wurde getriggert (DEBUG)".format(logic.name, logic.filename))

      Kommentar


        #4
        Vorschlag für eine kleine Logik, schnell mal hinger... und tut was es soll:

        Code:
        #!/usr/bin/env python3
        # cputemp.py
        import subprocess
        cputemp = subprocess.run(['cat', '/sys/class/thermal/thermal_zone0/temp'], stdout=subprocess.PIPE)
        sh.cpu.temp(round(int(cputemp.stdout.decode('utf-8')) / 1000, 1))
        Wobei "sh.cpu.temp" nur ein Beispiel-Item-Name ist. Da nimmst du was du willst.
        Die Logik lässt du z.B. alle 5 Minuten per Crontab triggern. Das sollte reichen (in den Logikparametern "Crontab(s) -> init" und "Cycle -> 300").
        Damit hast du die Temperatur in einem Item und kannst damit machen was du willst, also auch in die DB schreiben und dann als Plot anzeigen.

        Vielleicht geht das ja sogar als Einzeiler über eval in der Itemdefinition, da bin ich aber jetzt überfragt.

        Edit: Hab die Rundung auf 1 Nachkommastelle gleich eingebaut. Die 1 am Ende der letzten Zeile beliebig ändern. 0 = keine Nachkommastellen. Kann man auch komplett weg lassen, ist Default.

        Das sollte so nun für alle Systeme klappen, nicht nur für Raspis.
        Zuletzt geändert von Sipple; 01.09.2021, 10:53.

        Kommentar


          #5
          Für den Raspi:

          Ich lasse die Systemparameter CPU-Frequenz und Temperatur sowie die Uptime und die Flags auslesen, speichern und in der Visu anzeigen. Die Flags werden aus dem Statusfeld ausgelesen und in eigene Items verfrachtet. Die Anzeige der Flags erfolgt mit Symbolen in "ausgeblendet" (aus), grau (ist mal aufgetreten, aber nicht aktiv) sowie weiß (aktiv).

          Ich habe auch noch einen Plot über Frequenz und Temperatur laufen.

          Items:
          Code:
              hauspi:
                  temp:
                      type: num
                      database: init
                      visu_acl: ro
          
                  uptime:
                      type: num
                      visu_acl: ro
          
                      text:
                          type: str
                          visu_acl: ro
          
                  freq:
                      type: num
                      database: init
                      visu_acl: ro
          
                  flags:
                      type: num
                      visu_acl: ro
          
                      uv:
                          type: bool
                          database: init
                          eval_trigger: ..
                          eval: sh...() >> 0 & 1
                          visu_acl: ro
          
                      freq_cap:
                          type: bool
                          database: init
                          eval_trigger: ..
                          eval: sh...() >> 1 & 1
                          visu_acl: ro
          
                      throttled:
                          type: bool
                          database: init
                          eval_trigger: ..
                          eval: sh...() >> 2 & 1
                          visu_acl: ro
          
                      temp_limit:
                          type: bool
                          database: init
                          eval_trigger: ..
                          eval: sh...() >> 3 & 1
                          visu_acl: ro
          
                      uv_hist:
                          type: bool
                          database: init
                          eval_trigger: ..
                          eval: sh...() >> 16 & 1
                          visu_acl: ro
          
                      freq_cap_hist:
                          type: bool
                          database: init
                          eval_trigger: ..
                          eval: sh...() >> 17 & 1
                          visu_acl: ro
          
                      throttled_hist:
                          type: bool
                          database: init
                          eval_trigger: ..
                          eval: sh...() >> 18 & 1
                          visu_acl: ro
          
                      temp_limit_hist:
                          type: bool
                          database: init
                          eval_trigger: ..
                          eval: sh...() >> 19 & 1
                          visu_acl: ro

          Die Logik dazu:
          Code:
          #!/usr/bin/env python3
          # sys_stats.py.py
          
          import subprocess
          from datetime import timedelta
          
          def call(cmd, arg):
              process = subprocess.Popen([cmd, arg], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
              stdout, stderr = process.communicate()
              return stdout.decode('utf-8').strip()
          
          # seconds
          with open("/proc/uptime", "r") as f:
              upt, __, __ = f.read().partition(' ')
              upt = int(float(upt))
          
              ups = str(datetime.timedelta(seconds=upt))
          
          # float with 1 decimal
          with open("/sys/class/thermal/thermal_zone0/temp", "r") as f:
              tmp = int(float(f.read().strip()) / 100) / 10
          
          # MHz
          __, __, frq = call('vcgencmd', 'measure_clock arm').strip().partition('=')
          frq = int(int(frq) / 1000000)
          
          # int
          __, __, thr = call('vcgencmd', 'get_throttled').strip().partition('=')
          thr = int(thr, 16)
          
          # print(f'Result: f={frq}, flags={thr}, uptime={upt}, T={tmp}')
          
          sh.d.hauspi.freq(frq)
          sh.d.hauspi.flags(thr)
          sh.d.hauspi.uptime(upt)
          sh.d.hauspi.temp(tmp)
          sh.d.hauspi.uptime.text(ups)
          Und noch der Ausschnitt für die Visu, wenn gewünscht:

          Code:
          <div class="block">
          <div class="ui-bar-c ui-li-divider">hauspi</div>
          <div class="ui-fixed ui-body-a">
          <table width="100%">
          <tr>
          <td align="left" style="padding-left: 10px">Uptime:</td>
          <td></td>
          <td align="right">{{ basic.print('', 'd.hauspi.uptime.text') }}</td>
          </tr>
          <tr>
          <td align="left" style="padding-left: 10px">Temperatur:</td>
          <td>{{ icon.graph('', '', 'd.hauspi.temp', 20, 65) }}</td>
          <td align="right">{{ basic.print('', 'd.hauspi.temp', '°C', '', [55, 60], [icon0, '#f9a028', '#f00']) }}</td>
          </tr>
          <tr>
          <td align="left" style="padding-left: 10px">Frequenz:</td>
          <td>{{ icon.graph('', '', 'd.hauspi.freq', 500, 1400) }}</td>
          <td align="right">{{ basic.print('', 'd.hauspi.freq', 'MHz') }}</td>
          </tr>
          <tr align="center">
          <td colspan="3" align="center"><table><tr>
          <td align="center">
          {{ basic.symbol('', ['d.hauspi.flags.uv', 'd.hauspi.flags.uv_hist'], '', 'measure_voltage', true, 'VAR1', '#f00') }}
          {{ basic.symbol('', ['d.hauspi.flags.uv', 'd.hauspi.flags.uv_hist'], '', 'measure_voltage', true, 'VAR2 && !VAR1', '#ffffff') }}
          {{ basic.symbol('', ['d.hauspi.flags.uv', 'd.hauspi.flags.uv_hist'], '', 'measure_voltage', true, '!(VAR2 || VAR1)', '#444') }}
          </td>
          <td align="center">
          {{ basic.symbol('', ['d.hauspi.flags.freq_cap', 'd.hauspi.flags.freq_cap_hist'], '', 'measure_power_meter', true, 'VAR1', '#f00') }}
          {{ basic.symbol('', ['d.hauspi.flags.freq_cap', 'd.hauspi.flags.freq_cap_hist'], '', 'measure_power_meter', true, 'VAR2 && !VAR1', '#ffffff') }}
          {{ basic.symbol('', ['d.hauspi.flags.freq_cap', 'd.hauspi.flags.freq_cap_hist'], '', 'measure_power_meter', true, '!(VAR2 || VAR1)', '#444') }}
          </td>
          <td align="center">
          {{ basic.symbol('', ['d.hauspi.flags.throttled', 'd.hauspi.flags.throttled_hist'], '', 'jquery_forbidden', true, 'VAR1', '#f00') }}
          {{ basic.symbol('', ['d.hauspi.flags.throttled', 'd.hauspi.flags.throttled_hist'], '', 'jquery_forbidden', true, 'VAR2 && !VAR1', '#ffffff') }}
          {{ basic.symbol('', ['d.hauspi.flags.throttled', 'd.hauspi.flags.throttled_hist'], '', 'jquery_forbidden', true, '!(VAR2 || VAR1)', '#444') }}
          </td>
          <td align="center">
          {{ basic.symbol('', ['d.hauspi.flags.temp_limit', 'd.hauspi.flags.temp_limit_hist'], '', 'temp_temperature_max', true, 'VAR1', '#f00') }}
          {{ basic.symbol('', ['d.hauspi.flags.temp_limit', 'd.hauspi.flags.temp_limit_hist'], '', 'temp_temperature_max', true, 'VAR2 && !VAR1', '#ffffff') }}
          {{ basic.symbol('', ['d.hauspi.flags.temp_limit', 'd.hauspi.flags.temp_limit_hist'], '', 'temp_temperature_max', true, '!(VAR2 || VAR1)', '#444') }}
          </td>
          </tr></table></td>
          </tr>
          </table>
          </div>

          Kommentar


            #6
            Sipple
            Vielen Dank - ich scheitere an der Weiterverarbeitung --> aber

            Zitat von Morg Beitrag anzeigen
            Für den Raspi:


            hat recht ausführliche Dateien zur Verfügung gestellt

            Vielen Dank dafür


            --> leider zeigt mir den Item-Tree jeweils 0 oder nichts an --> dementsprechend kommt auf der VISU auch nichts an.

            Ich meine alles 1:1 übernommen zu haben... auch die sys_stats.py wird mir unter "Nutzerlogiken" im AdminInterface mit einem grünen Pfeil angezeigt
            Zuletzt geändert von Maexle; 01.09.2021, 12:07.

            Kommentar


              #7
              Der Befehl
              Code:
              cat /sys/class/thermal/thermal_zone0/temp
              liefert: 52616 also am Auslesen der Datei liegt es schon mal nicht

              Kommentar


                #8
                Darf dein shng-User das auch lesen?

                Hast du den Item-Tree und die Bezeichnung der Items entsprechend angepasst?

                Der abgedruckte Item-Tree hängt bei mir noch unterhalb vom Element "d", das ist hier aber nicht drin.

                In der Logik (und der Visu) sind die Items mit "d.hauspi...." bezeichnet.
                Zuletzt geändert von Morg; 01.09.2021, 18:47.

                Kommentar


                  #9
                  Zitat von Morg Beitrag anzeigen
                  Darf dein shng-User das auch lesen?
                  ich denke schon - wie kann ich das prüfen?


                  Zitat von Morg Beitrag anzeigen
                  Hast du den Item-Tree und die Bezeichnung der Items entsprechend angepasst?
                  das "d" entfernt und "alles um 1 nach links eingerückt"

                  Code:
                  # hauspi.yaml
                  hauspi:
                      temp:
                          type: num
                          database: init
                          visu_acl: ro
                          
                      uptime:
                          type: num
                          visu_acl: ro
                  
                          text:
                              type: str
                              visu_acl: ro
                  
                      freq:
                          type: num
                          database: init
                          visu_acl: ro


                  hier ebenfalls die "d." entfernt

                  Code:
                  
                  <tr align="center">
                  <td colspan="3" align="center"><table><tr>
                  <td align="center">
                  {{ basic.symbol('', ['hauspi.flags.uv', 'hauspi.flags.uv_hist'], '', 'measure_voltage', true, 'VAR1', '#f00') }}
                  {{ basic.symbol('', ['hauspi.flags.uv', 'hauspi.flags.uv_hist'], '', 'measure_voltage', true, 'VAR2 && !VAR1', '#ffffff') }}
                  {{ basic.symbol('', ['hauspi.flags.uv', 'hauspi.flags.uv_hist'], '', 'measure_voltage', true, '!(VAR2 || VAR1)', '#444') }}
                  </td>
                  <td align="center">
                  {{ basic.symbol('', ['hauspi.flags.freq_cap', 'hauspi.flags.freq_cap_hist'], '', 'measure_power_meter', true, 'VAR1', '#f00') }}
                  {{ basic.symbol('', ['hauspi.flags.freq_cap', 'hauspi.flags.freq_cap_hist'], '', 'measure_power_meter', true, 'VAR2 && !VAR1', '#ffffff') }}
                  {{ basic.symbol('', ['hauspi.flags.freq_cap', 'hauspi.flags.freq_cap_hist'], '', 'measure_power_meter', true, '!(VAR2 || VAR1)', '#444') }}
                  </td>
                  <td align="center">
                  {{ basic.symbol('', ['hauspi.flags.throttled', 'hauspi.flags.throttled_hist'], '', 'jquery_forbidden', true, 'VAR1', '#f00') }}
                  {{ basic.symbol('', ['hauspi.flags.throttled', 'hauspi.flags.throttled_hist'], '', 'jquery_forbidden', true, 'VAR2 && !VAR1', '#ffffff') }}
                  {{ basic.symbol('', ['hauspi.flags.throttled', 'hauspi.flags.throttled_hist'], '', 'jquery_forbidden', true, '!(VAR2 || VAR1)', '#444') }}
                  </td>
                  <td align="center">
                  {{ basic.symbol('', ['hauspi.flags.temp_limit', 'hauspi.flags.temp_limit_hist'], '', 'temp_temperature_max', true, 'VAR1', '#f00') }}
                  {{ basic.symbol('', ['hauspi.flags.temp_limit', 'hauspi.flags.temp_limit_hist'], '', 'temp_temperature_max', true, 'VAR2 && !VAR1', '#ffffff') }}
                  {{ basic.symbol('', ['hauspi.flags.temp_limit', 'hauspi.flags.temp_limit_hist'], '', 'temp_temperature_max', true, '!(VAR2 || VAR1)', '#444') }}
                  </td>
                  </tr></table></td>
                  </tr>
                  </table>
                  </div>



                  in der Logik ebenfalls -->


                  Code:
                  sh.hauspi.freq()(frq)
                  sh.hauspi.flags(thr)
                  sh.hauspi.uptime(upt)
                  sh.hauspi.temp(tmp)
                  sh.hauspi.uptime.text(ups)

                  Kommentar


                    #10
                    su - <shng-nutzer>

                    und dann nochmal

                    cat /sys/class/thermal/thermal_zone0/temp
                    vcgencmd measure_clock arm

                    Wenn das nicht geht, musst du schauen, wie du das zum Laufen bekommst (Rechte auf den jeweiligen Dateien, ggf. sudo...?)

                    Ich habe in der Logik noch das print-Kommando stehen, damit habe ich getestet, bis die Ergebnisse stimmten, und danach erst angefangen, in die Items zu schreiben.

                    Kommentar


                      #11
                      Morg
                      Danke für Deine Unterstützung


                      Zitat von Morg Beitrag anzeigen
                      su - <shng-nutzer>
                      da ich das Image aus dem Forum verwende --> sollte der User doch "smarthome" sein und mit diesem melde ich mich auch per ssh an


                      wenn ich ein "w" eingebe wird mir

                      Code:
                      USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
                      [MARKIEREN]smarthom[/MARKIEREN] pts/0
                      ich denke da fehlt einfach nur das "e" wegen der Spaltenbreite


                      Zitat von Morg Beitrag anzeigen
                      Ich habe in der Logik noch das print-Kommando stehen, damit habe ich getestet, bis die Ergebnisse stimmten, und danach erst angefangen, in die Items zu schreiben.

                      Zitat von Morg Beitrag anzeigen
                      # print(f'Result: f={frq}, flags={thr}, uptime={upt}, T={tmp}')
                      Du meinst diese Zeile? - wo wird den der "Print" ausgegeben?



                      edit: auch der Benutzer "pi" darf die "Temperatur/Takt Befehle" ausführen und bekommt auch ein Ergebnis
                      Zuletzt geändert von bmx; 02.09.2021, 14:15.

                      Kommentar


                        #12
                        Nachtrag zur Fehlereingrenzung

                        werden die Items händisch befüllt (Wert im Admin-Interface eingetragen) werden diese auf der Visu angezeigt. Und auch in die Datenbank geschrieben.
                        Zuletzt geändert von Maexle; 02.09.2021, 09:13.

                        Kommentar


                          #13
                          Den print (und ggf. Python-Fehler) bekommst du auf der shng-Konsole, dazu zB shng manuell mit -f starten...

                          Kommentar


                            #14
                            Du kannst einfache Logiken mit Print auch via Executor Plugin ausführen lassen und bekommst das Ergebnis direkt im Browser geliefert...

                            Kommentar


                              #15
                              Tut mir leid Eure beiden Antworten helfen mir nicht wirklich.


                              Zitat von bmx Beitrag anzeigen
                              Du kannst einfache Logiken mit Print auch via Executor Plugin ausführen lassen und bekommst das Ergebnis direkt im Browser geliefert...
                              sorry, ich verstehe nur Bahnhof....



                              hier konnte ich mir noch etwas zusammenreimen...
                              Zitat von Morg Beitrag anzeigen
                              Den print (und ggf. Python-Fehler) bekommst du auf der shng-Konsole, dazu zB shng manuell mit -f starten..
                              Code:
                              sudo systemctl stop smarthome.service
                              
                              sudo systemctl start smarthome.service -f

                              keine Ahnung ob das richtig war und überhaupt nicht wo mir was angezeigt werden soll

                              Kommentar

                              Lädt...
                              X