Events aus X_Notify() heraus erzeugen

Begonnen von Loredo, 12 Januar 2017, 21:49:10

Vorheriges Thema - Nächstes Thema

Loredo

Demnach sollte ja ein einfaches




    $hash->{NotifyOrderPrefix} = "10-";   # Want to be called before the rest



In X_Initialize() helfen. Tut es aber leider nicht. Sorry, aber ich steh wohl grad aufm Schlauch...
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Markus Bloch

Kannst du mal das vollständige Modul posten, so wie du es eben probiert hast?

Danke

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Loredo

Danke, Markus, dass du mal reinschauen willst. Sollte hoffentlich auch recht übersichtlich sein.
Anbei so wie ich es probiert habe.
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Markus Bloch

Wie sehen denn die Debugausgaben aus, welche du überall im Log hast?
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Loredo


2017.01.14 11:01:50.582 5: Cmd: >set Livingroom dim100%<
2017.01.14 11:01:50.582 3: FS20 set Livingroom on
2017.01.14 11:01:50.583 5: Triggering Livingroom (1 changes)
2017.01.14 11:01:50.583 5: Starting notify loop for Livingroom, 1 event(s), first is dim100%
2017.01.14 11:01:50.584 1: DEBUG0+++
$VAR1 = [
          'state: on'
        ];
2017.01.14 11:01:50.584 5: powerMap_Notify: Entering for Livingroom
2017.01.14 11:01:50.584 5: powerMap_powerMap: Entering for Livingroom
2017.01.14 11:01:50.584 5: powerMap Livingroom: state: val=on num=100
2017.01.14 11:01:50.584 4: powerMap Livingroom: power = 60
2017.01.14 11:01:50.584 5: powerMap_energy: Entering for Livingroom
2017.01.14 11:01:50.584 4: powerMap Livingroom: energy calculation results:
  energyOld : 0.0169444444444444 Wh
  powerOld  : 0.5 W
  power     : 60 W
  timeframe : 0.0830555555555555 h
  energyDiff: 0.0415277777777778 Wh
  energy    : 0.0584722222222222 Wh
2017.01.14 11:01:50.584 5: powerMap Livingroom: next update in 900 s
2017.01.14 11:01:50.585 1: DEBUG2+++ max=3
$VAR1 = [
          'dim100%',
          'pM_energy: 0.0584722222222222',
          'pM_power: 60'
        ];
2017.01.14 11:01:50.585 5: Triggering pm (1 changes)
2017.01.14 11:01:50.585 5: Starting notify loop for pm, 1 event(s), first is Last device: Livingroom
2017.01.14 11:01:50.586 5: Triggering AllLights (1 changes)
2017.01.14 11:01:50.586 5: Starting notify loop for AllLights, 1 event(s), first is undefined
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Loredo

Ich teste mit fhem.cfg.demo, Device: Livingroom, ergänzt durch:


defmod pm powerMap

attr Livingroom powerMap {\
state => {\
0 => 0.5,\
100 => 60,\
}\
}
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Markus Bloch

Hallo Loredo,

leider konnte ich es nicht schaffen das ganze gründlich zu ergründen aufgrund der Nichterreichbarkeit der Infrastruktur heute. Werde ich mir morgen in Ruhe anschauen.

Was mir soweit aufgefallen ist, dass ich Unit.pm bei mir nicht laden lässt, da in Unit.pm folgendes Statement enthalten ist:

use FHEM::Uconv

erst als ich das in use UConv; änderte, konnte ich powerMap laden. Ich verwende eine andere Ordnerstruktur als normal üblich (Synology Paket), daher liegt fhem.pl komplett woanders als die Module. Da der Modulpfad zu @INC gehört findet er so UConv.pm bei mir wieder korrekt im Modulpfad.

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Loredo

Danke dir, Markus. Hatte ich aber gar nicht mitbekommen ;-)
Das Forum läuft ja glücklicherweise noch woanders  8)


Zitat von: Markus Bloch am 14 Januar 2017, 15:16:09
Was mir soweit aufgefallen ist, dass ich Unit.pm bei mir nicht laden lässt, da in Unit.pm folgendes Statement enthalten ist:

use FHEM::Uconv


Hm, mir war nicht klar, dass jemand die Ordnerstruktur ändern würde.
Jedenfalls ging das seinerzeit nicht ohne FHEM::, keine Ahnung wieso. Habs auch grad entfernt und es scheint zu gehen. Strange!
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Markus Bloch

Hallo Loredo,

nach langer Zeit des Forschens und Debug-Loggings habe ich die Erklärung finden können. Mit folgendem Auszug funktioniert alles wie gewünscht:

    # foreign device events
    foreach my $event ( @{$events} ) {
        next
          if ( !$event
            or $event =~ /^($rname_e|$rname_p): /
            or $event !~ /: / );

        # only recalculate once no matter
        # how many events we get at once
        unless ($powerRecalcDone) {
            my $power = powerMap_powerMap( $name, $dev, $event );
            if ( defined($power) ) {
                $powerRecalcDone = 1;

                unless ( AttrVal( $dev, "powerMap_noEnergy", 0 ) ) {
                    my $energy = powerMap_energy( $name, $dev, $power );
                    readingsSingleUpdate($dev_hash, $rname_e, $energy, 1);
                }

                readingsSingleUpdate($dev_hash, $rname_p, $power, 1);
               
                # recalculate CHANGEDWITHSTATE for target device in deviceEvents()
                $dev_hash->{CHANGEDWITHSTATE} = [];
            }
        }
    }

     #InternalTimer( gettimeofday() + 0.1,
     #    "powerMap_readingsDelayedUpdate", \%readings );

    readingsSingleUpdate( $hash, "state", "Last device: $dev", 1 ) if ($powerRecalcDone);
    return undef;
}


Der Grund, warum die Events für deine pM_*Readings nicht erzeugt wurden, liegt an der Funktion deviceEvents() welche eine Kopie von $hash->{CHANGED} unter $hash->{CHANGEDWITHSTATE} anlegt. Da du diese Funktion aufrufst, befüllt deviceEvents() $hash->{CHANGEDWITHSTATE} mit geändertem "state"-Event.

FHEMWEB wird dann im Laufe des Notify-Vorgangs ebenfalls via NotifyFn aufgerufen. Hier wird ebenfalls deviceEvents() verwendet mit aktiviertem $with_state. Da nun $hash->{CHANGEDWITHSTATE} bereits beim Durchlauf von powerMap erzeugt wurde (und im Normalfall ja auch keine Änderungen stattfinden) wird das zuvor berechnete CHANGEDWITHSTATE an FHEMWEB zurückgegeben (wo die pM_*-Events nicht enthalten sind). Es erfolgt keine Neuberechnung. Daher erhält FHEMWEB nur die alten Einträge, welche vor dem Aufruf von powerMap vorhanden waren.

Daher muss in diesem ganz speziellen Fall in powerMap nach dem erzeugen der Readings/Events $hash->{CHANGEDWITHSTATE} wieder geleert werden. Dadurch erstellt deviceEvents() diesen neu auf Basis der Events, welche in $hash->{CHANGED} vorhanden sind. Da nun die pM-Events existieren, werden diese ebenfalls in CHANGEDWITHSTATE mit übernommen und FHEMWEB erhält diese ebenfalls als Events.

Man könnte in deviceEvents() dieses Caching von CHANGEDWITHSTATE abschalten, oder du musst eben manuell dieses leeren (NICHT löschen!!!).

Durch die Verwendung von den readings*update()-Funktionen werden auch die ganzen Zusatzattribute entsprechend berücksichtigt.

Gruß
Markus

Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

Loredo

Man krass, da wäre ich ja wirklich nie drauf gekommen.  ???

VIELEN VIELEN Dank für die Untersuchung, Sherlock! *thumbsUp*
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER