Homey Systemlast auslesen

Ich wollte einen Überblick über die Homey-Systemlast haben, ohne immer die Insights aufrufen zu müssen. Homey selbst bieten in den Flows oder Logik-Variablen/Tags keine Daten dazu. In HomeyScript aber schon.
Wer die Daten gern hätte, kann sie auf folgende Weise verwenden:

  1. HomeyScript anlegen
    grafik
    Die Kommentare (mit // am Beginn) könnt ihr aktivieren für Konsolenausgaben beim Skript-Test. Einfach die // löschen.
    Die Systemload-Daten enthalten 3 Werte. Das sind jeweils der Systemload über die letzten 1, 5 und 15 Minuten (soweit ich das in den Linux-Dokus gesehen hatte).

Das Skript zum Kopieren:

// Ausgabe des SystemLoad als Flow-Tag
sys = await Homey.system.getInfo( );
//console.log(sys);
//console.log(‘SystemLoad:’);
//console.log('1 min: ’ + sys.loadavg[0].toFixed(2));
//console.log('5 min: ’ + sys.loadavg[1].toFixed(2));
//console.log('15 min: ’ + sys.loadavg[2].toFixed(2));
await tag(“SystemLoad_1min”, sys.loadavg[0] );
await tag(“SystemLoad_5min”, sys.loadavg[1] );
await tag(“SystemLoad_15min”, sys.loadavg[2] );
return true;

  1. Flow anlegen.
    Ich habe 3 Flows angelegt, die je alle 1, 5 und 15min die Werte auslesen.


    Der Wert aus dem HomeyScript steht als Tag zur Verfügung (jeweils der Name aus dem tag(…)-Befehl)
    Den Wert könnt ihr nun verwenden. Ich veröffentliche die 3 Werte per MQTT.

  2. Zusatz für HomeAssistant-Verwender
    Die Werte können in HA als MQTT-Sensor aboniert werden:
    Inhalt der sensor.yaml (inkludiert in configuration.yaml - falls ihr das direkt in die YAML schreibt, müsst ihr noch - sensor ergänzen). Da über MQTT nur Strings importiert werden, muss noch in Float konvertiert werden. Mit *100 hat man gleich noch einen Prozentwert.

sensor.yaml:

# Homey System-Parameter
- platform: mqtt
  name: homeySystemLoad_1min
  state_topic: 'homey_publish/SystemLoad_1min'
  value_template: >-
    {{ (value | float * 100) | int  }}
  force_update: true
  unit_of_measurement: "%"
- platform: mqtt
  name: homeySystemLoad_5min
  state_topic: 'homey_publish/SystemLoad_5min'
  value_template: >-
    {{ (value | float * 100) |int  }}
  force_update: true
  unit_of_measurement: "%"
- platform: mqtt
  name: homeySystemLoad_15min
  state_topic: 'homey_publish/SystemLoad_15min'
  value_template: >-
    {{ (value | float * 100) |int  }}
  force_update: true
  unit_of_measurement: "%"

Dann könnt ihr schöne Diagramme in HA basteln:
grafik

6 Likes

Super idee!
leider bringt das skript ein Fehler bei jeden wert :roll_eyes: Sowohl in console test als einzeln. ZB await tag(“SystemLoad_1min”, sys.loadavg[0] ); führt zu:

:x: Script Error
:warning: SystemLoad.js:9
SyntaxError: Invalid or unexpected token
at new Script (vm.js:88:7)
at HomeyScriptApp.runScript (/app.js:296:23)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
at async Object.runScript (/api.js:24:18)

Was fehlt bei mir das das nicht klappt? Berechtigung auf das Token?

What about “broadcast system state” of the MQTT Hub app?

You are right. I’ve seen this info. But it’s updated in very short intervals.
My goal was to get values for fix periods, e.g. system load 15min every 15min without overlapping average values.

Die Zeile " sys = await…" hast du aber stehen lassen?

@RonnyW Tips to extend the info provided by the Hub? Maybe low hanging fruit?

1 Like

image

No, not at this moment. All right with the Hub :+1:

I made a special solution for my needs. Other user perhaps would like to use the values in flows. There is no need to extend something.
All other values could be extracted from the JSON info. To get sensor values for use in charts, you need to create new sensors reading the Json values. So it’s still some work in HA.
Bu I can’t imagine that many people would need every single value as single topic.

Perhaps a update every 1min would be enough.

…and what fruits :thinking: confused perhaps too late now :sweat_smile:

Ersetz mal bitte die Anführungszeichen durch die “normalen” Anführungszeichen (bei dir rot unterstrichen). Da scheint das Forum die Zeichen mit Unicode-Zeichen ersetzt zu haben.

Danke! :+1:

1 Like

I meant; maybe the custom code (Homeyscript and/or HA) can be fully omitted by a small and simple adjustment/addition of the info provided by the hub. Like adding the cumulated values for 1, 5 and 15 minutes. So it becomes available for everyone by just flipping the switch.

1 Like

Ah, that saying I didn’t know although I’m developer, too :upside_down_face:
I know this ambivalent situation from work. Sometimes it’s good to enlagre customer satisfaction with small additions.

Thanks for this offer.
The only thing I would propose are the values I get now with the flows:

  • single topics for systemload 1/5/15min to use directly in HA (sensor with history), perhaps homey/system/systemload/1min etc.
  • update the values in the period they contain the average data: every 1min/5min/15min
    That’s all :slight_smile:

@RonnyW the System state dispatcher of the Hub is a very basic implementation which just forwards the system info every 30 sec. in 20 lines of code (update() r131-151). I thought maybe you can create a small pull request with the additional info you need. You’ve got the code already :grinning:. I’ll make sure it will be pushed to the store asap.

Kleine Ergänzung: Ausgabe der App-Speichernutzung an HomeAssistant…

Ich wollte neben der Systemlast auch die Speichernutzung im HA-Dashboard haben - vor allem um zu prüfen, dass meine App sauber ohne Speicherleaks läuft.
Wer das auch machen möchte, kann dieses Beispiel übernehmen. Ich hatte ein paar Schwierigkeiten mit der AppListe in HA, deshalb ist das ggf. auch hilfreich für andere MQTT-Importe von JSON-Listen in HA.

1) HomeyScript:

// Ausgabe von SystemMemory-Inhalten als Flow-Tags
mem = await Homey.system.getMemoryInfo( );
var array = [];
var used = 0;
var free = 0;
var total = 0;
var json_dict;
for(var i in mem.types)
    array.push(mem.types [i]);
array = array.sort((a, b) => {
  return (a.size > b.size) ? -1 : 1;
});
json_dict = "{";
for(var i in array){
    used += array[i].size;
    array[i].size = Math.round(array[i].size /1000 /10)/100; 
    json_dict += '"'+array[i].name+'":"'+array[i].size+'"';
    if ( i<array.length-1)
      json_dict+=",";
}
json_dict += "}";
free = ( mem.total - used ) / 1000 / 1000;
used = used / 1000 / 1000;
total = mem.total / 1000 / 1000;
//console.log(JSON.stringify(array));
//console.log(array);
//console.log("Memory total: "+total.toFixed(2));
//console.log("Summe Apps: "+used.toFixed(2));
//console.log("Frei: "+free.toFixed(2));
//console.log(json_dict);
await tag("memoryTotal",  Math.round(total *100)/100 );
await tag("memoryUsed",  Math.round(used *100)/100 );
await tag("memoryFree",  Math.round(free *100)/100 );
await tag("memoryAppList",  json_dict );
return true;

Falls nach dem Kopieren Fehler in HomeyScript angezeigt werden, dann prüft bitte, ob die Anführungszeichen korrekt sind.
Das Script liest die Homey-Speicherdaten und gibt 3 Werte direkt aus (gesamt, genutzt, frei). Ich rechne auf MB mit Faktor 1000, weil das den Angaben in der HomeyApp entspricht.

Zusätzlich werden die Apps ausgelesen und in ein JSON-Dictionary konvertiert:
{“Homey”:“132.5”,“Andere”:“35.28”,“MQTT Hub”:“33.4”,…}
Das ist die Variante, die direkt als MQTT-Topic in HA importiert werden kann.

2. Übertragung per MQTT:
Auslesen und Senden an HA erfolgt per Flow:

3. MQTT-Sensor in HA:
In HA werden die Inhalte per MQTT-Sensor übernommen:

- platform: mqtt
  name: homeySystemMemoryTotal
  state_topic: 'homey_publish/SystemMemoryTotal'
  value_template: >-
    {{ value | float  }}
  force_update: true
  unit_of_measurement: "MB"
- platform: mqtt
  name: homeySystemMemoryUsed
  state_topic: 'homey_publish/SystemMemoryUsed'
  value_template: >-
    {{ value | float  }}
  force_update: true
  unit_of_measurement: "MB"
- platform: mqtt
  name: homeySystemMemoryFree
  state_topic: 'homey_publish/SystemMemoryFree'
  value_template: >-
    {{ value | float  }}
  force_update: true
  unit_of_measurement: "MB"
- platform: mqtt
  name: homeySystemMemoryAppList
  state_topic: 'homey_publish/SystemMemoryUsed'
  json_attributes_topic: 'homey_publish/SystemMemoryAppList'
  #json_attributes_template: '{{ value_json }}'
  value_template: '{{ value_json }}'

Die App-Liste wird als Attribute-Liste übernommen:
json_attributes_topic: ‘homey_publish/SystemMemoryAppList’

4. Anzeige in Dashboard:
Für die Anzeige verwende ich eine Chart-Komponente sowie die HACS-Komponente entity-attributes-card

Lovelace:

type: 'custom:entity-attributes-card'
title: false
heading_name: Apps
heading_state: MB
filter:
  include:
    - key: sensor.homeysystemmemoryapplist.*
  exclude:
    - key: sensor.homeysystemmemoryapplist.friendly_name

Das sieht das wie folgt aus:
grafik

grafik

3 Likes

Werd das nachher mal umsetzen.
Vielen Dank für das Teilen des Scripts.

Kleine Ergänzung:
Ich habe in der Custom-Komponente entity-attributes-card die Sortierung deaktiviert.
Ansonsten sortiert die Komponente nach Name. Ohne Sortierung wird die Sortierung aus HomeyScript nach MB beibehalten.
Dazu einfach diese Stellen löschen:

Datei in HA:
\www\community\entity-attributes-card\entity-attributes-card.js
grafik

Kommentarzeilen: Original
Darunter: ohne .sort()

Wenn HA bzw. der Browser die geänderte Datei nicht liest, dann am besten kopieren, anpassen und in HA die neue Datei eintragen:

grafik

HA: Einstellungen / Lovelace Dashboard / Ressourcen:

grafik

2 Likes

Kleine Anmerkung:
In der nächsten Version von HA, wird die oben angegebene configuration.yaml nicht mehr funktionieren. Bitte das hier verwenden (MQTT Sensoren in HA):

mqtt:
  sensor:

    - name: homeySystemLoad_1min
      state_topic: 'homey_publish/SystemLoad_1min'
      value_template: >-
        {{ (value | float * 100) | int  }}
      force_update: true
      unit_of_measurement: "%"

    - name: homeySystemLoad_5min
      state_topic: 'homey_publish/SystemLoad_5min'
      value_template: >-
        {{ (value | float * 100) |int  }}
      force_update: true
      unit_of_measurement: "%"

    - name: homeySystemLoad_15min
      state_topic: 'homey_publish/SystemLoad_15min'
      value_template: >-
        {{ (value | float * 100) |int  }}
      force_update: true
      unit_of_measurement: "%"
      

Wer im gleichen Atemzug noch Homeys Speicherauslastung übertragen möchte, einfach um diesen Part ergänzen:

    - name: memoryUsed
      state_topic: 'homey_publish/memoryUsed'
      force_update : true
      unit_of_measurement: "MB"
2 Likes

Danke Ronny, Harry, und Uwe!

Letztes Jahr habe ich das noch nicht verstanden, aber jetzt hat es geklappt.
Ich habe es ein wenig erweitert, daher sind hier die configuration.yaml-Einträge für die verschiedenen MQTT-Hub-Themen von Homey-Systemdaten

Weitere verwendete mqtt-Einträge @ configuration.yaml:

    - name: homeyMemory
      state_topic: "homey/$RAM/apps"
      json_attributes_topic: "homey/$RAM/homey"
      value_template: >-
        {{ value_json.Homey | float | int }}
      force_update: true

    - name: homeySystemUptime
      state_topic: "homey/system/uptime_days"
      value_template: >-
        {{ value | float * 1 | int }}
      force_update: true
      unit_of_measurement: "days"

    # Uptime, convert seconds to days
    - name: homeySystemUptimeMQTT
      state_topic: "homey/system/info"
      value_template: >-
       {{ (value_json.system.uptime | float/60/60/24) | round(2) }}
      force_update: true
      unit_of_measurement: "days"

      # Free memory in % - direct from MQTT Hub
    - name: homeyFreememHumanMQTT
      state_topic: "homey/system/info"
      value_template: >-
        {{ value_json.system.freememHuman | string }}
      force_update: true

    - name: homeynodeVersionMQTT
      state_topic: "homey/system/info"
      value_template: >-
        {{ value_json.system.nodeVersion | string }}
      force_update: true

    - name: homeyhomeyVersionMQTT
      state_topic: "homey/system/info"
      value_template: >-
        {{ value_json.system.homeyVersion | string }}
      force_update: true

    - name: homeyModelIdMQTT
      state_topic: "homey/system/info"
      value_template: >-
        {{ value_json.system.homeyModelId | string }}
      force_update: true

    - name: homeyModelNameMQTT
      state_topic: "homey/system/info"
      value_template: >-
        {{ value_json.system.homeyModelName | string }}
      force_update: true

    - name: homeywifiSsidMQTT
      state_topic: "homey/system/info"
      value_template: >-
        {{ value_json.system.wifiSsid | string }}
      force_update: true

    - name: homeywifiAddressMQTT
      state_topic: "homey/system/info"
      value_template: >-
        {{ value_json.system.wifiAddress | string }}

Viel Spaß mit diesem lustigen Spielzeug :wink:

Peter

2 Likes

Ich habe das hauptsächlich nachgebaut, um mich rechtzeitig in Sicherheit bringen zu können.
Bei 400-500% Systemlast, steht die Kugel kurz vor der Explosion.
Es ist auch interessant zu sehen, wie sich Homeys Arbeitsspeicher, ganz von alleine immer mehr zumüllt. Bei größerer als 1000, löst HA automatisch einen Neustart aus und ich beginne wieder bei 800 MB.

1 Like

Cool Uwe!
Ah, gute Idee, dasselbe Diagramm mit unterschiedlichen Zeitspannen zu verwenden
Ich habe es selbst über Homey gemacht. Ich überprüfe Homeys eigene Speichernutzung und Systemlast von Insights

https://community.homey.app/t/the-flow-exchange-r-exchange-your-flows-with-others/68981/7?u=peter_kawa

Another nice option, range selectors:
Screenshot from 2022-10-26 16-29-38

Add this to the graph card:

color_scheme: paired
layout:
  xaxis:
    rangeselector:
      'y': 1.5
      buttons:
        - count: 1
          step: minute
        - count: 1
          step: hour
        - count: 12
          step: hour
        - count: 1
          step: day
        - count: 7
          step: day

1 Like