PRESENCE cover version - anderer Ansatz basierend auf aktuellem Code

Begonnen von martinp876, 23 Dezember 2020, 14:38:45

Vorheriges Thema - Nächstes Thema

bertl

Hallo Jörg,

naja, wenn das Device 'disabled' ist (attr disable = 1), dann macht es auch Sinn, aber wenn nur das Attribut 'disable' existiert (attr disable = 0) und trotzdem state auf 'disabled' geht, verstehe ich die Sinnhaftigkeit nicht - der Status des Devices ist nämlich in diesem Fall NICHT disabled sondern enabled.
Oder wenn man das Attribut 'disable' löscht (deleteattr), dass dann state auf 'disabled' geht, verstehe ich auch nicht.

Aber wenn du als Modul-Verwalter der Meinung bist, dass die aktuelle Logik Sinn macht, dann soll es so sein.
Ich baue mir einfach einen Workaround mit OldReadingsVal.

Gruß Robert

JoWiemann

Hallo Robert,

da habe ich mich nicht präzise genug ausgedrückt. Ich habe den state für Löschen und 0 herausgenommen, wobei ich 0 wohl noch nachziehen muss. Das state Reading soll nur noch bei aktivem Disable gesetzt sein.
Jörg Wiemann

RPi 4 B mit 4 GByte bookworm, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM; zigbee2mqtt

ioBroker als Datenlieferant für z.B. Anker, Samsung

bertl

Ja genau, so ist es verständlich und macht Sinn!

Danke, Robert

FHEM-Tester

Hallo,

es wäre wirklich toll, wenn PRESENCE2 ebenso die Möglichkeit bekäme, dass man ein PRESENCE2 Device via active/inactive ein- bzw. ausschalten kann und ebenso wäre es toll, wenn es powerCmd Attribut Support bekäme.

Dann müsste ich bei mir nicht alles umschreiben/ändern sondern könnte quasi einen fast 1:1 Austausch vornehmen.

Wäre das möglich? :-)

Vielen Dank vorab.

JoWiemann

Zitat von: FHEM-Tester am 04 Juli 2026, 13:15:43Wäre das möglich? :-)

Vielen Dank vorab.

Hallo FHEM-Tester,

werde ich mir ansehen. Deinem Nickname folgend, darfst Du dann Testen  ;)

Grüße Jörg
Jörg Wiemann

RPi 4 B mit 4 GByte bookworm, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM; zigbee2mqtt

ioBroker als Datenlieferant für z.B. Anker, Samsung

JoWiemann

Hallo FHEM-Tester,

anbei eine Version zum Testen.

Grüße Jörg
Jörg Wiemann

RPi 4 B mit 4 GByte bookworm, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM; zigbee2mqtt

ioBroker als Datenlieferant für z.B. Anker, Samsung

FHEM-Tester

#306
Hallo Jörg,

herzlichen Dank für den prompten Support und Lösung :-)

Es funktioniert soweit. Was noch nicht ganz stimmig ist: attr disable 1 und es wird dennoch munter weiter getestet, statusRequest usw. Commands funktionieren alle. disable 1 sollte IMHO disable ALLES sein - oder?

Eine Frage: hat es einen Grund wieso du active/inactive ohne Event aktualisierst?

Anbei ein Patch der die Hilfe ein wenig ändert und den HTML Tag "name" durch "id" ersetzt, dann klappt das mit der Hilfe in der GUI selbst auch richtig.
In dem Patch habe ich ebenso readingsUpdate mit Event für die o.g. Sachen aktiviert, zumindest brauche ich es so. Ebenso ein Clean-Up von diversen überflüssigen leading/trailing Leerzeichen hier und da.

Mir ist aufgefallen, dass Du oder martinp876 wahrscheinlich ein globales Search & Replace vom Wort Presence gemacht hast und es durch PRESENCE2 ersetzt hast ;-)
An einigen Stellen passt das sinngemäß überhaupt nicht, die Links zu collectord, presenced usw. bekommen ebenso alle ein 404, weil es kein https://svn.fhem.de/trac/export/HEAD/trunk/fhem/contrib/PRESENCE2 gibt.

Gibt es eigentlich irgendeinen Grund wieso man auf das O/S Ping angewiesen ist, zumindest bei Linux?
Ich habe mir dafür mal Funktionen gebaut.

Die hier nutzt den Echo-Port als Überprüfung:
sub ping_tcp($) {
        use Net::Ping;

        my ($ip) = @_;
        my $p = Net::Ping->new('tcp', 2);

        print "Net::Ping TCP $ip ... ";
        if ($p->ping($ip)) {
                print "UP\n";
                return 1;
        }
        else {
                print "DOWN\n";
                return 0;
        }
}


Geht auch mit ICMP, dafür braucht das Modul aber root-Rechte:
sub ping_imcp($) {
        use Net::Ping;

        my ($ip) = @_;
        my $p = Net::Ping->new('icmp', 2);

        print "Net::Ping ICMP $ip ... ";
        if ($p->ping($ip)) {
                print "UP\n";
                return 1;
        }
        else {
                print "DOWN\n";
                return 0;
        }
}


Hier mit ICMP ohne Root-Rechte (braucht libio-async-perl und libnet-async-ping-perl), nutzt sysctl net.ipv4.ping_group_range:
sub ping_async($) {
        use IO::Async::Loop;
        use Net::Async::Ping;

        my ($ip) = @_;
        my $return = -1;

        print "Net::Async::Ping $ip ... ";

        my $p = Net::Async::Ping->new(
                        'icmp' => {
                                default_timeout => 2,
                                use_ping_socket => 1,
                        },
        );
        my $loop = IO::Async::Loop->new;

        my $future = $p->ping($loop, $ip);

        $future->on_done(sub {
                print "UP\n";
                $loop->stop();
                $return = 1;
        });

        $future->on_fail(sub {
                print "DOWN\n";
                $loop->stop();
                $return = 0;
        });

        $loop->loop_once();
        $loop->run;

        return $return;
}
z.B.
# sysctl -w net.ipv4.ping_group_range="20 20"
bei mir ist das die Gruppe dialout, der User fhem ist Mitglied der Gruppe bzw. ist die primäre Gruppe.

Könnte man zumindest mal drüber nachdenken es als Zusatz für Linux einzubauen um von dem Schei** Forking wegzukommen - oder? :-)
Ich nutze PRESENCE bzw. jetzt bald PRESENCE2 für Ping nur mit Mode Function und o.g. Funktion(en).