läuft: (Geekworm Raspi UPS HAT Board v1.0) RasPi USV

Begonnen von Frank_Huber, 09 Januar 2018, 14:49:39

Vorheriges Thema - Nächstes Thema

Frank_Huber

Hallo allerseits,

nachdem ich ein paar Tage experimentieren musste bis die Geekworm USV schön mit FHEM zusammengespielt hat will ich den Code natürlich gerne mit euch teilen.

Es geht um diese Raspberry USV:
https://www.banggood.com/Geekworm-UPS-HAT-Board-2500mAh-Lithium-Battery-For-Raspberry-Pi-3-Model-B-Pi-2B-B-A-p-1105260.html
Geliefert wird die Platine samt 2500mAh Akku zu einem Preis von ca 15 Euro inkl Versand.
Diese hält mein Testsystem um die 6 Stunden am Rennen.

Einen Shutdown erreiche ich über DOIF, über den darauf folgenden Boot Up mach ich mir keine Gedanken, da es wohl eher selten mehr als 6 Stunden Stromausfall geben wird. :-)
Und wenn dann doch muss ich eben am UPS board 2x den Taster drücken...

Hinweis:
Den Code (abgesehen von der myUtils) bitte über raw config importieren!

Kommunizieren tut das ganze über I2C. I2C sollte also in FHEM eingerichtet sein.
Hier am Beispiel für den RPI2:
defmod I2C RPII2C 1

Damit können wir jetzt schon per manuellem Kommando die USV abfragen.
Abrufbare Werte sind "nur" der Ladestand in % und die Spannung in V.
gelöst habe ich dies mit einem Dummy und Userreadings. Es ist bestimmt noch nicht perfekt und würde sich bestimmt auch vereinfachen lassen.
Aber es funktioniert. :-) Meine Programmierkenntnisse waren damit erschöpft.

zuerst in die 99_myUtils.pm folgendes eintragen:
sub i2c_USV_Batt_Voltage()
{
my @parts = split(/ /,fhem "get I2C read 36 2 2",1);
$parts[8] eq "Ok" ? return ($parts[2] * 256 + $parts[3])*0.000078125 : return "9999";
}

sub i2c_USV_Batt_Percent()
{
my @parts = split(/ /,fhem "get I2C read 36 4 2",1);
$parts[8] eq "Ok" ? return ($parts[2] * 256 + $parts[3])/256 : return "9999";
}


Der Dummy dazu:
defmod I2C_USV dummy
attr I2C_USV DbLogExclude V_direct,P_direct,state
attr I2C_USV DbLogInclude Voltage,Percent,Trend
attr I2C_USV room USV
attr I2C_USV stateFormat Battery: Percent % | Voltage V\
Ladung/Entladung letzte 10min: Trend %
attr I2C_USV userReadings V_direct {i2c_USV_Batt_Voltage},\
P_direct {i2c_USV_Batt_Percent},\
Voltage {sprintf("%.2f", ReadingsVal("I2C_USV","V_direct",0))},\
Percent {sprintf("%.1f", ReadingsVal("I2C_USV","P_direct",0))},\
Trend difference {ReadingsVal("I2C_USV","Percent",0)}

Das logging kann auch wieder raus.
Also dann DbLogExclude .* und den Include löschen.
Die hab ich zur Analyse noch drin. musste ja irgendwie sehen wie schnell der sich entläd und wieder läd... :-)

Aktuelisierung beim Systemstart per notify:
defmod USV_state_at_bootup notify global:INITIALIZED set I2C_USV get
attr USV_state_at_bootup room USV


Zyklische Aktualisierung alle 10 Minuten:
defmod I2C_USV_get at +*00:10:00 set I2C_USV get
attr I2C_USV_get DbLogExclude .*
attr I2C_USV_get room USV


Ein DOIF welches mir regelmäßig Telegram schickt und das System bei 2% herunterfährt:
Laden / Entladen wird über den Trend überwacht. Deshalb die Datenabfrage der USV auch nur alle 10 Minuten. Der % Unterschied wird sonst zu gering.
defmod I2C_USV_DOIF DOIF ([I2C_USV:Trend] <= -2 and [I2C_USV:Percent] <= 90 and [I2C_USV:Percent] > 2) (set TelegramBot message Test-PI auf USV-Strom! Ladestand [I2C_USV:Percent] %)\
DOELSEIF ([I2C_USV:Percent] <= 2) (set TelegramBot message Test-PI USV unter 2 Prozent. System wird heruntergefahren!) (sysshutdown)\
DOELSEIF ([I2C_USV:Trend] >= 2 and [I2C_USV:Percent] < 94)  (set TelegramBot message Test-PI hat wieder Netzstrom. Ladestand [I2C_USV:Percent] %)\
DOELSEIF ([I2C_USV:Percent] >= 94) (set TelegramBot message Test-PI USV voll geladen. Ladestand [I2C_USV:Percent] %)
attr I2C_USV_DOIF DbLogExclude .*
attr I2C_USV_DOIF repeatcmd 2400::1800:
attr I2C_USV_DOIF room USV


Der Systemshutdown muss allerdings erst eingerichtet werden. Hier half mir Otto's Blog, Danke Otto!
auf Raspbian Ebene folgenden Code ausführen:
sudo -i
echo "fhem ALL=(ALL) NOPASSWD: /sbin/shutdown" >/etc/sudoers.d/011_fhem-nopasswd
chmod 0440 /etc/sudoers.d/011_fhem-nopasswd

Dann in FHEM einen cmdAlias einrichten:
defmod Alias_SystemShutdown cmdalias SysShutdown AS "sudo /sbin/shutdown"
attr Alias_SystemShutdown DbLogExclude .*
attr Alias_SystemShutdown room USV


Mein Plot zum testen,
FHEM device:
defmod Plot_I2C_USV SVG logdb:Plot_I2C_USV:HISTORY
attr Plot_I2C_USV DbLogExclude .*
attr Plot_I2C_USV captionPos auto
attr Plot_I2C_USV endPlotNow 1
attr Plot_I2C_USV endPlotToday 1
attr Plot_I2C_USV label "USV-Akku - Ladestand $data{currval2} %, Spannung $data{currval1}V DC"
attr Plot_I2C_USV plotsize 800,200
attr Plot_I2C_USV room USV

gplot file:
# Created by FHEM/98_SVG.pm, 2018-01-03 00:26:38
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<L1>'
set ytics
set y2tics
set grid y2tics
set ylabel "Spannung"
set y2label "Prozent"
set yrange [3.5:4.2]
set y2range [0:100]

#logdb I2C_USV:Voltage::
#logdb I2C_USV:Percent::

plot "<IN>" using 1:2 axes x1y1 title 'Spannung' ls l2 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Prozent' ls l0 lw 1 with lines


Im Anhang noch ein Screenshot des FHEM Raums.

Wenn es Fragen gibt lasst es mich hier wissen, Vrbesserungen sind ebenfalls Willkommen. :-)

Quellen:
https://www.banggood.com/Geekworm-UPS-HAT-Board-2500mAh-Lithium-Battery-For-Raspberry-Pi-3-Model-B-Pi-2B-B-A-p-1105260.html
http://www.raspberrypiwiki.com/index.php/Raspi_UPS_HAT_Board
http://www.raspberrypiwiki.com/index.php/File:How-to-use-via-i2c.pdf
http://heinz-otto.blogspot.de/2017/08/raspberry-ausschalten-mit-fhem.html

EDIT:
- 2018-03-08 Korrektur für die myUtils: das Logging ausgeschaltet. https://forum.fhem.de/index.php?topic=85480
- 2018-03-07 Korrektur der Schritte auf Raspbian, "sudo -i" eingefügt.

FFHEM

Tolle Arbeit, vielen Dank!
Da ich z. Zt. etwas Ähnliches suche, ist das sehr interessant.

Eine Frage bzgl. des Neustarts habe ich dennoch: Du schreibst, wenn der Spannungsausfall länger als 6 Std. dauert, drückst Du auf dem Board 2 x einen Taster.
Heißt das, dass der Raspi, wenn er einmal heruntergefahren ist, nicht mehr selbst hochfährt (egal, ob dabei der Akku nach mehr als 6 Stunden leer ist oder die Netzspannung nach 5 Minuten wieder da ist)?

Vielen Dank!
Gruß
Friedhelm
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

Frank_Huber

Hi Friedhelm,

Ja, das ist so. nach ca 6 Stunden fährt der Pi bei 2% runter.
Irgendwann dannach schaltet dann auch die USV aus.

Vorgehensweise wenn usv noch an:
-> Taster an USV drücken -> AUS -> Taster an USV drücken -> AN -> PI fährt hoch.

man kann aber über größere Akkus auch weit höhere Zeiten erreichen.
die USV gibt es auch ohne Akku für paar Euro weniger.
Ein beliebiger Lithium Akku mit 3,7V Nennspannung tut es.

Man könnte bestimmt mit entsprechendem Aufwand den PI wieder starten lassen.
im "GANZ AUS" Fall würde wohl ein Y-Kabel in der Stromversorgung reichen.

Wenn aber der PI noch an ist wird es schwierig ihn zu starten.

Grüße
Frank

Foxm66

Hi,
habe gerade etliche Zeit verbracht, meine USV zu integrieren.
Läuft aber über ein Python Skript.
(http://www.linuxblognf.de/usv-fuer-den-raspberry-pi-mit-raspi-ups-hat/)
Fährt auch mittlerweile sauber runter bei 10%.
Aber!
Ich habe ein Y Kabel. Lt. Hersteller soll er selber wieder hochfahren. Funktioniert aber nicht.
Ich muss erst das RPI Kabel abziehen. Dann warten, bis die USV auf laden umschaltet . Dann fährt der RPI wieder hoch. (evtl. den Taster 1x drücken)
Kabel anstecken. Fertig.
Wahrscheinlich ist das Y Kabel überflüssig.
... aber es ist schon so - wann ist die Spannung mal so weg, das es länger als 6 h dauert. Zu dem Schluss bin ich auch gekommen.
Eigentlich reicht es, das USV anzustecken. Fertig.

VG

Tilo

Frank_Huber

Zitat von: Foxm66 am 23 Februar 2018, 09:29:33
Hi,
habe gerade etliche Zeit verbracht, meine USV zu integrieren.
Läuft aber über ein Python Skript.
(http://www.linuxblognf.de/usv-fuer-den-raspberry-pi-mit-raspi-ups-hat/)
Fährt auch mittlerweile sauber runter bei 10%.
Aber!
Ich habe ein Y Kabel. Lt. Hersteller soll er selber wieder hochfahren. Funktioniert aber nicht.
Ich muss erst das RPI Kabel abziehen. Dann warten, bis die USV auf laden umschaltet . Dann fährt der RPI wieder hoch. (evtl. den Taster 1x drücken)
Kabel anstecken. Fertig.
Wahrscheinlich ist das Y Kabel überflüssig.
... aber es ist schon so - wann ist die Spannung mal so weg, das es länger als 6 h dauert. Zu dem Schluss bin ich auch gekommen.
Eigentlich reicht es, das USV anzustecken. Fertig.

Hi Tilo,

Du könntest ihn später runterfahren lassen. So dass kurz nach dem Shutdown auch die USV leer ist und der PI aus geht.
Dann fährt er auch wieder hoch wenn die Spannung zurück ist.

Aber wie Du es ja auch schreibst, wann ist denn schon der Strom so lange weg...

/Frank

Ralph

läuft - bei mir leider nicht so gut.

Hallo Frank,
habe versucht Dir zu folgen.
Ich brauche nicht wirklich alles, aber bei mir scheiterts schon am Anfang.


Internals:
   CFGFN     
   NAME       I2C_USV
   NR         548
   STATE      Battery: Percent % | Voltage V Ladung/Entladung letzte 10min: Trend %
   TYPE       dummy
   READINGS:
     2018-03-03 18:23:18   P_direct        95.37109375
     2018-03-03 18:23:18   V_direct        4.156171875
     2018-03-03 18:23:18   state           get
Attributes:
   room       BinDa,U_USV_RasPi
   stateFormat Battery: Percent % | Voltage V Ladung/Entladung letzte 10min: Trend %
   userReadings V_direct {i2c_USV_Batt_Voltage},P_direct {i2c_USV_Batt_Percent},\
Voltage {sprintf("%.2f", ReadingsVal("I2C_USV","V_direct",0))},\
Percent {sprintf("%.1f", ReadingsVal("I2C_USV","P_direct",0))},\
Trend difference {ReadingsVal("I2C_USV","Percent",0)}

Hier hatte ich erhofft, dass die Volt und der %uale Ladezustand im state gezeigtr werden.
Ist aber nicht und ich weiß nicht warum ?

Die DOIF meldet beim Einrichten schon Fehler:
-------
I2C_USV_DOIF DOIF: expected DOELSEIF or DOELSE: \ DOELSEIF ([I2C_USV:Percent] <= 2) (set TelegramBot message Test-PI USV unter 2 Prozent. System wird heruntergefahren!) (sysshutdown)\ DOELSEIF ([I2C_USV:Trend] >= 2 and [I2C_USV:Percent] < 94)  (set TelegramBot message Test-PI hat wieder Netzstrom. Ladestand [I2C_USV:Percent] %)\ DOELSEIF ([I2C_USV:Percent] >= 94) (set TelegramBot message Test-PI USV voll geladen. Ladestand [I2C_USV:Percent] %)
--------

Den Rest habe ich mir dann erstmal verkniffen.
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

Frank_Huber

#6
Dir fehlt noch das at zur zyklischen Aktualisierung.
Bei Aktualisierung werden dann die userReadings berechnet und erzeugt.

Das doif muss ich mir nachher am PC anschauen.
Melde mich dann nochmal.

Hast du das doif über raw config importiert, zeilenweise über die Befehlszeile oder direkt in die cfg?

Wenn du den Code in der raw config importierst sollte er problemlos reinrutschen.

Edit
Mit dem dummy kann auch ein Import Fehler passiert sein.
Lade am besten die Codes über raw config rein, so hab ich sie auch exportiert.

Werde ich oben im Text noch ergänzen.


Grüße
Frank

Ralph

#7
Ich arbeite - weil unbedarft - über die Befehlszeile und ergänze dann.

Das at und das start-notify hatte ich schon.

Editor ist Ultra-Edit, der spricht auch Linux-Zeilenschaltungen.

Von raw config höre ich nun erstmalig, mal schauen.
Nachtisch:
Kannte ich nicht, funktioniert gut, nun ging darüber auch die DOIF einzurichten.
Geht nun auch fast alles, die Plots habe ich mangels DB nicht eingerichtet.

Nicht funktionieren tut:
echo "fhem ALL=(ALL) NOPASSWD: /sbin/shutdown" >/etc/sudoers.d/011_fhem-nopasswd
chmod 0440 /etc/sudoers.d/011_fhem-nopasswd

FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

Frank_Huber

#8
In jedem Gerät gibt es ganz unten einen link für raw config.
Öffne ihn in einem beliebigen Gerät und füge dort den Code ein und drücke execute commands.
Lösche am besten die Geräte der usv vorher nochmal.

Für die Befehlszeile müsstest du die Zeilenumbrüche rausnehmen.
Also alles von define bis attr in eine Zeile.
Jeweils den backslash (\) und den Zeilenumbruch raus.

Anfangs kannte ich die raw config auch nicht, mittlerweile möchte ich es nicht mehr missen. Gibt nichts einfacheres.
Kannst das ganze Gerät samt Attribute auf einen Rutsch rein importieren.

Mit dem Handy online, daher kurz gefasst...

Frank_Huber



Zitat von: Ralph am 03 März 2018, 20:27:10
Nicht funktionieren tut:
echo "fhem ALL=(ALL) NOPASSWD: /sbin/shutdown" >/etc/sudoers.d/011_fhem-nopasswd
chmod 0440 /etc/sudoers.d/011_fhem-nopasswd
Das sind Eingaben auf der system shell.
Also per ssh auf den RasPi und dort eingeben.


Mit dem Handy online, daher kurz gefasst...


Ralph

Moin, ja klar,
weiß ich doch.
Ebendort gehts nicht.
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

Tom_S

ZitatMoin, ja klar,
weiß ich doch.
Ebendort gehts nicht.

geht schon. Kommt eine Fehlermeldung? vielleicht "keine Berechtigung"?
bist du root?

LG Tom_S
RaspberryPI2 + pilight, 3x AVR-NetIO, LW12, LW12HX, LW12FC; MAX-Lan, ESP8266, Arduino, H801, Neopixel, Solaredge, Modbus

Frank_Huber

#12
Zitat von: Tom_S am 07 März 2018, 11:49:15
geht schon. Kommt eine Fehlermeldung? vielleicht "keine Berechtigung"?
bist du root?
Danke für den Hinweis, hab das "sudo " oben eingefügt. ixch arbeite in der Konsole immer mit "sudo -i". :-)


Zitat von: Ralph am 05 März 2018, 20:07:14
Moin, ja klar,
weiß ich doch.
Ebendort gehts nicht.
Ralph, die Konsole muss im Admin Modus sein.
Also sudo -i zuerst und dann die Befehle, oder ein "sudo " vor jeden Befehl setzen.
Eine klare Fehlermeldung hätte uns da bestimmt früher drauf gebracht. :-)

Und sorry dass ich erst heute antworte. Hab deinen Post leider übersehen.

Tom_S

#13
Zitat
Also sudo -i zuerst und dann die Befehle, oder ein "sudo " vor jeden Befehl setzen

hallo Frank_Huber
ist nicht ganz richtig. Die sudosers darf nur root schreiben. Mit sudo bekommst du nur root Rechte.

oder ein "sudo " vor jeden Befehl setzen
wird also nicht funktionieren.

sudo -i
dagegen schon

LG Tom_S
RaspberryPI2 + pilight, 3x AVR-NetIO, LW12, LW12HX, LW12FC; MAX-Lan, ESP8266, Arduino, H801, Neopixel, Solaredge, Modbus

Frank_Huber

#14
Zitat von: Tom_S am 07 März 2018, 17:49:55
hallo Frank_Huber
ist nicht ganz richtig. Die sudosers darf nur root schreiben. Mit sudo bekommst du nur root Rechte.

oder ein "sudo " vor jeden Befehl setzen
wird also nicht funktionieren.

sudo -i
dagegen schon

LG Tom_S
Hmmmm,

Ich dachte immer sudo - i macht das gleiche wie sudo vor dem Befehl, nur dauerhaft?
Werd ich auf jeden Fall testen. :-)
Danke für den sudo Kurs falls das stimmt. [emoji482]

Edit:

Recht hatter!
Geht nur mit sudo -i vorab.
Habs im ersten Post schon angepasst.

Danke nochmal Tom!