|
|
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) |
Zeile 1: |
Zeile 1: |
| == Idee: Unterbrechungsfreie Spannungsversorgung "PIUSV+" direkt ansteuern ==
| | [[Unterbrechungsfreie Spannungsversorgung "PIUSV+" direkt ansteuern]] |
| | |
| Hier wird der direkten Zugriff und Steuerung der Unterbrechungsfreien Stromversorgung PIUSV+, die früher von CW2 und aktuell über Reichelt vertrieben wird, beschrieben.
| |
| Direkter Zugriff bedeutet, dass die Kommunikation vollständig über die I2C-Schnittstelle erfolgt, wie es die Originalsotfware "piusmon" auch bewerkstelligt.
| |
| | |
| Der direkte Zugriff hat folgenden Vorteile:
| |
| * Die Installation der Originalsoftware "piusmon", die für den Betrieb der USV vorgesehen ist, wird nicht mehr nötig. Die Originalsoftware, die nicht mehr vom ursprünglichen Hersteller supportet wird, arbeitet nicht immer zuverlässig.
| |
| * Es muss kein zusätzliches Skript in die piusmon-Software zum sauberen runterfahren des FHEM-Servers eingebunden werden.
| |
| * Die direkte Ansteuerung bietet mehr Möglichkeiten (auch für eigene Erweiterungen). So wird beispielsweise wie hier beschrieben der Shutdown nicht nach einer festen Zeit ausgelöst, sondern abhängig von einer bestimmten Akkusspannung
| |
| * Es können diverse Werte wie Versorgungspannung, Pi-Spannung, Pi-Strom, Pi-Leistung und Akku-Status ausgelesen bzw. angezeigt werden.
| |
| | |
| == Voraussetzung ==
| |
| | |
| I2C-Daten werden über ein I2C Interface Modul wie beispielsweise RPII2C, FRM oder NetzerI2C gesendet. Daher muss eines dieser Module zuvor definiert werden (siehe Commandref).
| |
| Nachfolgend wurde der Zugriff auf die I2C-Schnittstelle über das Modul RPII2C realisiert.
| |
| | |
| In der Datei "99_myUtils.pm" müssen die folgende Funktionen kopiert werden:
| |
| | |
| <syntaxhighlight lang=pl>
| |
| sub USV_Werte_auslesen($$)
| |
| {
| |
| my ($USV_Netzteilspannung_Error_Counter, $USV_Akkuspannung_Error_Counter) = @_;
| |
| | |
| my $content;
| |
| my $u_akku_high;
| |
| my $u_akku_low;
| |
| my $u_akku;
| |
| my $u_netz_high;
| |
| my $u_netz_low;
| |
| my $u_netz;
| |
| my $u_pi_high;
| |
| my $u_pi_low;
| |
| my $u_pi;
| |
| my $i_pi_high;
| |
| my $i_pi_low;
| |
| my $i_pi;
| |
| my $p_pi;
| |
| my $usv_meldung
| |
| | |
| # TWI_CMD_GETVOLTAGE
| |
| fhem("set PIi2c_1 writeByte 18 02");
| |
| | |
| $content=fhem("get PIi2c_1 readblock 18 10",1);
| |
| $content=~ m/received : (\d+).(\d+).(\d+).(\d+).(\d+).(\d+).(\d+).(\d+).(\d+).(\d+) |/is;
| |
| $u_akku_high=$1;
| |
| $u_akku_low=$2;
| |
| $u_netz_high=$7;
| |
| $u_netz_low=$8;
| |
| $u_pi_high=$5;
| |
| $u_pi_low=$6;
| |
| $i_pi_high=$3;
| |
| $i_pi_low=$4;
| |
| | |
| $u_akku=((($u_akku_high & 0x7F)*256+$u_akku_low)/1000);
| |
| $u_netz=((($u_netz_high & 0x7F)*256+$u_netz_low)/1000);
| |
| $u_pi=((($u_pi_high & 0x3F)*256+$u_pi_low)/1000);
| |
| $i_pi=((($i_pi_high & 0x3F)*256+$i_pi_low)/1000);
| |
| $p_pi=floor($u_pi*$i_pi*1000+0.5)/1000;
| |
| | |
| if ($u_akku<5 && $u_akku>2.5 && $u_netz<6 && $u_pi<6 && $i_pi<3 && not($u_pi==0 && $i_pi>0) && not($i_pi==0 && $u_pi>0))
| |
| {
| |
| if ($u_netz<0.1)
| |
| {
| |
| $USV_Netzteilspannung_Error_Counter++;
| |
| if ($USV_Netzteilspannung_Error_Counter==2) { $usv-meldung="FHEM: USV-Netzspannung fehlt!"; }
| |
| fhem("set USV_Netzteilspannung_Error_Counter $USV_Netzteilspannung_Error_Counter");
| |
| }
| |
| else
| |
| {
| |
| $USV_Netzteilspannung_Error_Counter=0;
| |
| fhem("set USV_Netzteilspannung_Error_Counter $USV_Netzteilspannung_Error_Counter");
| |
| }
| |
|
| |
| if ($u_akku<3.0)
| |
| {
| |
| $USV_Akkuspannung_Error_Counter++;
| |
| if ($USV_Akkuspannung_Error_Counter==2) { $usv-meldung="FHEM: USV-Akkuspannung zu niedrig!"; }
| |
| fhem("set USV_Akkuspannung_Error_Counter $USV_Akkuspannung_Error_Counter");
| |
| }
| |
| else
| |
| {
| |
| $USV_Akkuspannung_Error_Counter=0;
| |
| fhem("set USV_Akkuspannung_Error_Counter $USV_Akkuspannung_Error_Counter");
| |
| }
| |
|
| |
| if (($u_netz<0.1) && ($u_akku>3.0) && ($u_akku<3.5)) # shutdown-Bedingung ermitteln
| |
| {
| |
| $usv-meldung="Raspberry Pi und USV wurden wegen Stromausfall abgeschaltet!";
| |
| USV_abschalten();
| |
| rasp_shutdown();
| |
| }
| |
|
| |
| $u_akku=$u_akku." V (3.0 ... 4.2 V)";
| |
| $u_netz=$u_netz." V (5V)";
| |
| $u_pi=$u_pi." V (5V)";
| |
| $i_pi=$i_pi." A";
| |
| $p_pi=$p_pi." W";
| |
| fhem("set USV_Datagramm $content");
| |
| fhem("set USV_Akkuspannung $u_akku");
| |
| fhem("set USV_Netzteilspannung $u_netz");
| |
| fhem("set USV_Spannung $u_pi");
| |
| fhem("set USV_Strom $i_pi");
| |
| fhem("set USV_Leistung $p_pi");
| |
| fhem("set USV_Meldung $usv_meldung")
| |
| }
| |
| }
| |
| | |
| | |
| sub USV_abschalten()
| |
| {
| |
| # TWI_CMD_SHUTDOWN
| |
| fhem("set PIi2c_1 writeByte 18 10");
| |
| fhem("set PIi2c_1 writeByte 18 15");
| |
| }
| |
| | |
| sub rasp_shutdown()
| |
| {
| |
| my @processes = `sudo shutdown -h now`;
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| Anmerkung:
| |
| Um den Raspberry direkt vom FHEM aus über den Befehl "sudo shutdown -h now" auszuschalten, muss in die Datei "/etc/sudoers.d/010_pi-nopasswd" hinter dem Eintrag
| |
| | |
| <pre>
| |
| pi ALL=(ALL) NOPASSWD: ALL
| |
| </pre>
| |
| | |
| folgendes ergänzt werden
| |
| | |
| <pre>
| |
| pi ALL=(ALL) NOPASSWD: ALL
| |
| fhem ALL=(ALL) NOPASSWD: /sbin/reboot, /sbin/shutdown, /sbin/halt
| |
| </pre>
| |
| | |
| In der Datei "fhem.cfg" kann dann die Anzeige der USV-Parameter und die Abschaltung der USV beispielsweise folgendermaßen realisiert werden:
| |
| | |
| <pre>
| |
| #i2C-Schnittstelle einrichten
| |
| define PIi2c_1 RPII2C 1
| |
| | |
| # PI USV+ Netzteilspannung
| |
| define USV_Netzteilspannung dummy
| |
| attr USV_Netzteilspannung fp_Raspberry 25,460,2,USV Netzteilspannung:
| |
| define USV_Netzteilspannung_Error_Counter dummy
| |
| define USV_Netzteilspannung_Error_Counter_Init notify global:INITIALIZED set USV_Netzteilspannung_Error_Counter 0
| |
| | |
| # PI USV+ Akkuspannung
| |
| define USV_Akkuspannung dummy
| |
| attr USV_Akkuspannung fp_Raspberry 75,460,2,USV Akkuspannung:
| |
| define USV_Akkuspannung_Error_Counter dummy
| |
| define USV_Akkuspannung_Error_Counter_Init notify global:INITIALIZED set USV_Akkuspannung_Error_Counter 0
| |
| | |
| | |
| # PI USV+ Spannung
| |
| define USV_Spannung dummy
| |
| attr USV_Spannung fp_Raspberry 125,460,2,USV PI-Spannung:
| |
| | |
| # PI USV+ Strom
| |
| define USV_Strom dummy
| |
| attr USV_Strom fp_Raspberry 175,460,2,USV PI-Strom:
| |
| | |
| # PI USV+ Leistung
| |
| define USV_Leistung dummy
| |
| attr USV_Leistung fp_Raspberry 225,460,2,USV PI-Leistung:
| |
| | |
| # PI USV+ Leistung
| |
| define USV_Meldung dummy
| |
| attr USV_Leistung fp_Raspberry 225,460,2,USV Meldung:
| |
| | |
| # PI USV+ abschalten
| |
| define USV_Werte_auslesen at +*00:00:05 { USV_Werte_auslesen(Value("USV_Netzteilspannung_Error_Counter"),Value("USV_Akkuspannung_Error_Counter")) }
| |
| </pre>
| |
| | |
| == Ausblick ==
| |
| Es wäre sinvoll, das hier beschriebene in einem eigenen Modul z.B. "52_I2C_PIUPS_PLUS.pm" unterzubringen, um den Zugriff noch eleganter zu realisieren.
| |
| | |
| [[Kategorie:Examples]]
| |
| [[Kategorie:Code Snippets]]
| |