Einrichtung eines Akku am Cubietruck

Begonnen von FHEMAN, 25 März 2015, 22:31:58

Vorheriges Thema - Nächstes Thema

FHEMAN

Hallo zusammen,

ich habe einen Akku am Cubie als USV angeschlossen und  zur Kontrolle für einen Stromausfall samt Benachrichtigung konfiguriert. Meine 5,3 Ah Version hält 6 Stunden durch (CUL, WLAN, SSD).
Da mir eine Komplettlösung hierzu fehlte, möchte ich hier mal meine Erkenntnisse zusammenfassen:

1.a Akku Li-Akku, 3,7 V-/5,3 Ah besorgen und anschließen
bei Pollin gibt es einen mit passendem Kabel+Stecker dran.
Achtung:
Anschließen nur im ausgeschalteten Zustand
Anschluss ist am Rand (nicht der zur Mitte hin hinter den HDD Stromanschlüssen)

1.b Akku Kapazität von 2100 auf 5300mAh hochsetzen
(Basis ist das Igor Image)

Anzeige der aktuell eingestellten Kapazität
cat /sys/class/power_supply/battery/energy_full_design
Die script.fex bearbeiten
cp /boot/script.bin /boot/script.bin.bak
bin2fex /boot/script.bin /boot/script.fex
sudo nano /boot/script.fex

Folgendes Suchen (ca. 3 Seiten vor Dateiende) ...
pmu_battery_cap = 2100
...und ersetzen durch Folgendes
pmu_battery_cap = 5300
Überprüfung der neu eingestellten Kapazität
cat /sys/class/power_supply/battery/energy_full_design

Ein Reboot wäre nun sinnvoll (sudo shutdown -r now)

2. SYSMON installieren und userReading konfigurieren (hier im Beispiel als Minimalkonfiguration)
define sysmon SYSMON
attr sysmon event-on-change-reading battery,power_battery_stat
attr sysmon userReadings battery:(power_battery_stat) {((split(/\s+/, ReadingsVal("sysmon","power_ac_stat",1)))[0] eq 0) ? ((split(/\s+/, ReadingsVal("sysmon","power_battery_stat",100)))[4]) : "AC" }

Nun haben wir ein weiteres Reading battery: AC|0..100
Wenn AC angezeigt wird, wird eine andere Stromquelle genutzt und der Akku wird ggf. geladen. Ansonsten wird die Ladung in % angezeigt.

3. Ein schicker Dummy darf nicht fehlen (und wird auch als OldValue Ersatz verwendet)
(http://i.imgur.com/yUovCT3.jpg)
define Cubie_Battery dummy
attr Cubie_Battery alias Cubie Battery
attr Cubie_Battery devStateIcon (0.*|1.):measure_battery_0@red (2.*|3.*):measure_battery_25@orange (4.*|5.*|6.*):measure_battery_50@green (7.*|8.*):measure_battery_75@green (9.*|10.*):measure_battery_100@green
attr Cubie_Battery group Cubie
attr Cubie_Battery icon measure_battery_0


BTW: Im aktuellen Release fehlt das measure_battery_25 Icon leider, also nicht wundern.

4. Kontrollfunktion inkl. Benachrichtigung und Herunterfahren
define notify_sysmon_Battery notify sysmon:battery.* {
    my $battValue = ReadingsVal("sysmon","battery", -1);
    my $oldBattValue = -1;
    if ((defined "Cubie_Battery") && (Value("Cubie_Battery") ne $battValue)) {
      $oldBattValue = Value("Cubie_Battery");
      fhem("set Cubie_Battery ".$battValue);
      if (($battValue ne "AC") && (($oldBattValue eq "AC") || ($oldBattValue > $battValue))) { 
        if ($battValue < 15) {
          SendMessage("New Battery status: SHUTDOWN", "Battery Capacity ULTRA LOW: $battValue Prozent >>> SYSTEM SHUTDOWN in 5 min", "Pushover,Mail,Log","loud");
          system("/usr/bin/sudo shutdown -h 5 &");
        } elsif ($battValue < 20) {
          SendMessage("New Battery status: ".$battValue, "Battery Capacity LOW: ".$battValue." Prozent", "Pushover,Mail,Log","loud");
        } elsif ($battValue =~ m/(20|30|40|50|60|70|80|9.|100)/) {
          SendMessage("New Battery status: ".$battValue, "Battery Capacity: $battValue Prozent", "Pushover,Mail,Log","normal");
        }
      } elsif (($battValue eq "AC") && ($oldBattValue ne "AC")) {
          SendMessage("New Battery status: ".$battValue, "", "Pushover,Mail,Log","normal");
      }
   }
}

(Diese Funktion könnte auch wunderbar in die 99_myUtils.pm)

Es erfolgt nun eine Meldung (in meinem Beispiel sendMessage Funktion) bei
Wechsel von AC auf Batteriebetrieb
Entladen, zw. 90% und 100% bei jedem Prozent, danach in 10er Prozentschritten
Wechsel vom Batteriebetrieb auf AC Betrieb
Bei 19% gibt es eine letzte Warnung
Bei 14% wird der Cubie heruntergefahren

5. Damit das Herunterfahren klappt (benötigt sudo Rechte), muss der User fhem noch in sudoers eingetragen werden
In Telnet:
sudo visudo oder sudo nano /etc/sudoers

In der /etc/sudoers Datei folgendes hinzufügen:
# Cmnd alias specification
Cmnd_Alias SHUTDOWN_HALT_REBOOT = /sbin/shutdown

# User privilege specification
fhem ALL = NOPASSWD: SHUTDOWN_HALT_REBOOT


Optimierungen sind willkommen!
Ansonsten viel Spaß evtl. beim Nachbauen!

Ronny
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

betateilchen

Zitat von: derron am 25 März 2015, 22:31:58
Optimierungen sind willkommen!

Dazu braucht man kein fhem, das kann der Cubietruck auch ganz alleine auf Hardware- und Betriebssystembasis.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

FHEMAN

Zitat von: betateilchen am 26 März 2015, 07:10:11
Dazu braucht man kein fhem, das kann der Cubietruck auch ganz alleine auf Hardware- und Betriebssystembasis.

Ich hatte das Herunterfahren vorher auch per Cronjob Script erledigt und in Logfiles geschrieben. Das schöne an der fhem Lösung ist aber, dass man hier schon alles hat: Messaging, Logs, Visualisierung, GUI etc. - für mich als Linux Einsteiger ideal. Wenn auch ganz klar nicht perfekt.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

Spezialtrick

Bei mir wird das Reading "battery" leider nicht korrekt angelegt. Mal ist es da mal verschwindet es einfach wieder. Woran liegt das?

Muss man die Kapazität des verwendeten Akkus eigentlich noch irgendwo auf Systemebene eintragen?
FHEM - Debmatic - Zigbee2MQTT - Homekit

hexenmeister

Zitat von: Spezialtrick am 10 April 2015, 12:11:32
Muss man die Kapazität des verwendeten Akkus eigentlich noch irgendwo auf Systemebene eintragen?

Diese Einstellung steht dem System in der Datei /sys/class/power_supply/battery/energy_full_design zur Verfügung. Man kann sie dort jedoch nicht direkt eintragen, sie wird beim Booten durch /boot/script.bin definiert. Die Datei muss nicht genau so heißen, den genauen Namen erfährt man aus /boot/uEnv.ct (kann je nach eingesetzten Betriebsystem(version) etwas anders sein). Der zuständige Eintrag  kann z.B. so aussehen: script=/boot/ct-hdmi.bin. Die Schript-Datei ist jedoch binär. Damit sie bearbeitet werden kann, muss sie vorher mittels bin2fex-Utility in lesbare Form umgesetzt werden und nach der Bearbeitung auch wieder zurück (bin2fex -> script.fex -> edit -> fex2bin -> script.bin). Der anzupassender Parameter heißt pmu_battery_cap. Die Angaben haben in mAh zu erfolgen.

Spezialtrick

Zitat von: hexenmeister am 10 April 2015, 22:59:27
Diese Einstellung steht dem System in der Datei /sys/class/power_supply/battery/energy_full_design zur Verfügung. Man kann sie dort jedoch nicht direkt eintragen, sie wird beim Booten durch /boot/script.bin definiert. Die Datei muss nicht genau so heißen, den genauen Namen erfährt man aus /boot/uEnv.ct (kann je nach eingesetzten Betriebsystem(version) etwas anders sein). Der zuständige Eintrag  kann z.B. so aussehen: script=/boot/ct-hdmi.bin. Die Schript-Datei ist jedoch binär. Damit sie bearbeitet werden kann, muss sie vorher mittels bin2fex-Utility in lesbare Form umgesetzt werden und nach der Bearbeitung auch wieder zurück (bin2fex -> script.fex -> edit -> fex2bin -> script.bin). Der anzupassender Parameter heißt pmu_battery_cap. Die Angaben haben in mAh zu erfolgen.

Hallo Alexander,

danke für deine Antwort. Habe dies natürlich auch schon auf deinem Blog gesehen, aber leider nicht richtig verstanden. Ich habe versucht die Datei einfach mit "sudo nano /sys/class/power_supply/battery/energy_full_design" zu bearbeiten. Leider fehlen meinem root Benutzer offenbar die Berechtigungen dafür:

[ Error writing /sys/class/power_supply/battery/energy_full_design: Permission denied ]

Könntest du den Vorgang genauer ausführen?



Zudem komme ich mit der Anleitung nicht wirklich klar. Sobald ich das "attr sysmon event-on-change-reading battery" Attribut setze wird automatisch nach der ersten Veränderung das Reading "Battery" nicht mehr angezeigt. Dies passiert immer sobald ein event-on-change-reading Attribut gesetzt wird. Durch das fehlende Event funktioniert es natürlich nicht. Der Dummy wird ebenfalls nicht aktualisiert. :(
FHEM - Debmatic - Zigbee2MQTT - Homekit

hexenmeister

Hallo Miro,

das ist keine "richtige" Datei, sie wird vom Kernel in den Verzeichnisbaum eingeblenden, daher kann sie auch nicht  beschrieben werden, auch nicht als root.
Die eigentliche Einstellung befindet sich in einer Datei in dem Verzeichnis "/boot". Welche genau das ist, steht in uEnv.ct.
Zitat/boot $ cat uEnv.ct
console=ttyS0,115200
root=/dev/mmcblk0p1 rootwait
extraargs=rootfstype=ext4 sunxi_ve_mem_reserve=0 sunxi_g2d_mem_reserve=0 sunxi_no_mali_mem_reserve sunxi_fb_mem_reserve=16 hdmi.audio=EDID:0 disp.screen0_output_mode=EDID:1280x720p60 panic=10 consoleblank=0
script=/boot/ct-hdmi.bin
kernel=/boot/uImage

Bei mir ist es also ct-hdmi.bin. Die wird jedoch in einem binären Format erwartet und kann daher nicht direkt editiert werden. Zuerst verwandelst Du sie in Text:
alex@cubie /boot $ sudo su

Load: 0,12, 0,21, 0,22 - Board: 41.0°C - Drive: 47°C / 444Gb - Memory: 1786Mb

root@cubie:/boot# bin2fex /boot/ct-hdmi.bin ct-hdmi.fex
fexc-bin: /boot/ct-hdmi.bin: version: 0.1.2
fexc-bin: /boot/ct-hdmi.bin: size: 46240 (83 sections)


Jetzt kannst Du die Datei bearbeiten. Da ist eine Menge hardwarespezifischen Einstellungen. Sei vorsichtig damit.
Danach muss sie wieder in bin-Format umgewandelt werden.

root@cubie:/boot# fex2bin ct-hdmi.fex meine_neue_datei.bin

Dann ersetzt Du die Original mit Deiner Version.
Ich würde Dir für alle Fälle zu einem vorherigen Backup raten.

Ich hoffe, das war besser verständlich :)

Grüße,

Alexander

Spezialtrick

Hallo Alexander,

nun ist es auch für mich nachvollziehbar. :) Ich habe es nun hinbekommen und meinen Akku auf 5300 mAh gestellt.

Allerdings hießen sämtliche Dateien etwas anders. Angefangen bei der uEnv.ct. Diese heißt bei mir uEnv.txt. In dieser finde ich die Angabe script=cubietruck.bin. Im Ordner /boot ist genau diese Datei nicht vorhanden. Es finden sich lediglich die Dateien magic.bin und script.bin.

Daraufhin hab ich es mit der script.bin versucht und konnte mich an deiner Anleitung entlang hangeln. Vielen Dank! :)


Kannst du dir erklären warum mir das Attribut "attr sysmon event-on-change-reading battery" immer das Reading battery löscht?

Könntest du versuchen die Anleitung von derron bei dir umzusetzen? Ich stelle mir nämlich grad die Frage, ob ein Fehler in der Anleitung ist oder ob ich irgendetwas falsch machen.  ;D
FHEM - Debmatic - Zigbee2MQTT - Homekit

hexenmeister

Zitat von: Spezialtrick am 11 April 2015, 17:47:00
Allerdings hießen sämtliche Dateien etwas anders.

Scheinbar ist jede Version da etwas eigen.

Zitat von: Spezialtrick am 11 April 2015, 17:47:00
Kannst du dir erklären warum mir das Attribut "attr sysmon event-on-change-reading battery" immer das Reading battery löscht?

Könntest du versuchen die Anleitung von derron bei dir umzusetzen? Ich stelle mir nämlich grad die Frage, ob ein Fehler in der Anleitung ist oder ob ich irgendetwas falsch machen.  ;D

Das kann ich leider auch nicht erklären. Ich benutze nur event-on-update-reading. Ich habe die Zeile mit dem userReading von derron ausprobiert. Reading 'battery' wird angezeigt und aktualisiert (nicht sofort, sondern wenn SYSMON die entsprechenden Quell-Readings aktualisiert).

Dummy habe ich nicht angelegt, warum sollte es aber nicht funktionieren? Notify in der Form kann ich auch nicht gebrauchen. Das herunterfahren von Cubietruck wird bei mir in einem cron-job vorgenommen. Ich finde das in FHEM fehl am Platz.

Grüße,

Alexander

Spezialtrick

Zitat von: hexenmeister am 11 April 2015, 19:35:47
Das kann ich leider auch nicht erklären. Ich benutze nur event-on-update-reading. Ich habe die Zeile mit dem userReading von derron ausprobiert. Reading 'battery' wird angezeigt und aktualisiert (nicht sofort, sondern wenn SYSMON die entsprechenden Quell-Readings aktualisiert).

So ist es bei mir auch. Bleibt das Reading denn bestehen, wenn du "event-on-update-reading" bzw. "event-on-change-reading" setzt? Sobald ich dieses Attribut setze, verschwindet das Reading battery nach kurzer Zeit.
FHEM - Debmatic - Zigbee2MQTT - Homekit

hexenmeister

Ich habe event-on-update-reading für
   
cpu_temp,cpu_temp_avg,cpu_freq,eth0_diff,loadavg,ram,fs_.*,stat_cpu_percent,power_ac_stat,power_battery_stat

Bei mi verschwindet nichts.

Spezialtrick

Zitat von: hexenmeister am 11 April 2015, 19:59:52
Ich habe event-on-update-reading für
   
cpu_temp,cpu_temp_avg,cpu_freq,eth0_diff,loadavg,ram,fs_.*,stat_cpu_percent,power_ac_stat,power_battery_stat

Bei mi verschwindet nichts.

Ich habe nun deinen Code kopiert und um das Reading battery ergänzt und es bleibt tatsächlich bestehen... Warum auch immer. ^^

Mit dem Notify habe ich aber leider auch Probleme... Wenn ich ein blankes Notify erstelle und diesen Teil

sysmon:battery.*{
    my $battValue = ReadingsVal("sysmon","battery", -1);
    my $oldBattValue = -1;
    if ((defined "Cubie_Battery") && (Value("Cubie_Battery") ne $battValue)) {
      $oldBattValue = Value("Cubie_Battery");
      fhem("set Cubie_Battery ".$battValue);
      if (($battValue ne "AC") && (($oldBattValue eq "AC") || ($oldBattValue > $battValue))) { 
        if ($battValue < 15) {
          SendMessage("Battery status changed","Battery Capacity ULTRA LOW: ".$battValue." Prozent >>> SYSTEM SHUTDOWN in 5 min", "Pushover,Mail,Log","loud");
          system("/usr/bin/sudo shutdown -h 5 &");
        } elsif ($battValue < 20) {
          SendMessage("Battery status changed","Battery Capacity LOW: ".$battValue." Prozent", "Pushover,Mail,Log","loud");
        } elsif ($battValue =~ m/(20|30|40|50|60|70|80|9.|100)/) {
          SendMessage("Battery status changed","Battery Capacity: $battValue Prozent", "Pushover,Mail,Log","normal");
        }
      } elsif (($battValue eq "AC") && ($oldBattValue ne "AC")) {
          SendMessage("Battery status changed","AC Mode", "Pushover,Mail,Log","normal");
      }
   }
}


in die Definition kopiere funktioniert es nicht. Und wenn ich den gesamte Definition

define notify_sysmon_Battery notify sysmon:battery.*{
    my $battValue = ReadingsVal("sysmon","battery", -1);
    my $oldBattValue = -1;
    if ((defined "Cubie_Battery") && (Value("Cubie_Battery") ne $battValue)) {
      $oldBattValue = Value("Cubie_Battery");
      fhem("set Cubie_Battery ".$battValue);
      if (($battValue ne "AC") && (($oldBattValue eq "AC") || ($oldBattValue > $battValue))) { 
        if ($battValue < 15) {
          SendMessage("Battery status changed","Battery Capacity ULTRA LOW: ".$battValue." Prozent >>> SYSTEM SHUTDOWN in 5 min", "Pushover,Mail,Log","loud");
          system("/usr/bin/sudo shutdown -h 5 &");
        } elsif ($battValue < 20) {
          SendMessage("Battery status changed","Battery Capacity LOW: ".$battValue." Prozent", "Pushover,Mail,Log","loud");
        } elsif ($battValue =~ m/(20|30|40|50|60|70|80|9.|100)/) {
          SendMessage("Battery status changed","Battery Capacity: $battValue Prozent", "Pushover,Mail,Log","normal");
        }
      } elsif (($battValue eq "AC") && ($oldBattValue ne "AC")) {
          SendMessage("Battery status changed","AC Mode", "Pushover,Mail,Log","normal");
      }
   }
}


in die Kommandozeile kopiere und ausführe erhalte ich folgende Fehler:

Unknown command my, try help.
Unknown command if, try help.
Unknown command fhem("set, try help.
Unknown command if, try help.
Unknown command system("/usr/bin/sudo, try help.
Unknown command }, try help.
Unknown command }, try help.
Unknown command }, try help.
Unknown command }, try help.


:( :( :(
FHEM - Debmatic - Zigbee2MQTT - Homekit

FHEMAN

#12
Sorry, ich habe nicht mitbekommen, dass hier gepostet wurde.
Die Kapazitätseinstellung hat bei mir nichts verändert. Zumindest habe ich keinen Unterschied bei Lade- und Entladedauer bemerkt. Aber ich werde das mal nachtragen. Danke, hexenmeister!

@Spezialtrick: dein Fehler sieht für mich nach Syntaxfehler an irgendeiner Stelle aus. Kannst Du nochmal das gesamte Notify hier reinkopieren. Vielleicht auch direkt aus der fhem.cfg.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB

Spezialtrick

#13
Ich habe nun mal das Code-Beispiel kopiert, das eben noch in deinem Post vorhanden war, derron. ^^

Damit hat es weitgehend funktioniert. :) Der Dummy wird schon mal korrekt befüllt, aber Nachrichten werden nicht verschickt, obwohl Pushover korrekt definiert ist. Im Logfile findet sich aber auch ein Fehler:

2015.04.11 21:21:09 3: notify_sysmon_Battery return value: Undefined subroutine &main::SendMessage called at (eval 413) line 17.

Offenbar fehlt mir noch eine subroutine.  :o

2015.04.11 21:47:10 3: notify_sysmon_Battery return value: Undefined subroutine &main::SendMessage called at (eval 633) line 14.
2015.04.11 21:52:10 3: notify_sysmon_Battery return value: Undefined subroutine &main::SendMessage called at (eval 673) line 17.
FHEM - Debmatic - Zigbee2MQTT - Homekit

FHEMAN

Der Code war genau der gleiche wie oben, deswegen habe ich ihn herausgenommen :)

SendMessage ist eine Funktion von mir, die logt, mailt, pushovert und smst. Du solltest Dir da einfach Dein konfiguriertes Pushover aufrufen. Oder sendMail. Was Du halt machen willst.
NUC7i5 | PROXMOX | FHEM 6.2 | 1 HMLAND | 2 UART | HM | LMS | HIFIBERRY | DOORBIRD | BLINK | BUDERUS | HUE | ALEXA | MILIGHT | LUFTDATENINFO | MQTT| ZIGBEE2MQTT | INDEGO | ROBOROCK | SMA | APC | OPENWB