MQTT on-for-timer

Begonnen von Pf@nne, 12 Juni 2015, 18:30:32

Vorheriges Thema - Nächstes Thema

Pf@nne

Moin,

ich möchte von meiner fhem-Instanz (A) über einen MQTT_DEVICE einen I2C-Port steuern (B),
das klappt ja auch ganz gut!
Nu möchte ich zusätzlich zu den Stes "on off" auch "on-for-timer" an den Broker publishen.
Das klappt irgendwie nicht.

define WP_Aktoren MQTT_DEVICE
attr WP_Aktoren IODev MQTT_Broker
attr WP_Aktoren alias WP Zirkulation
attr WP_Aktoren autoSubscribeReadings /Aktoren/WP/+
attr WP_Aktoren devStateIcon on:10px-kreis-rot off:1px-spacer
attr WP_Aktoren publishSet on off on-for-timer /Aktoren/WP/state/set
attr WP_Aktoren room Aktoren
attr WP_Aktoren stateFormat state
attr WP_Aktoren subscribeReading_state /Aktoren/WP/state


Zum Testen habe ich auf einen Raspberry mal ein subscibe auf folgenden Topic eingetragen:
root@Raspberry203:~# mosquitto_sub -d -t /Aktoren/WP/+/+


Wie gesagt, "on" und "off" kommen durch, "on-for-timer" sehe ich aber nicht.
Ich sehe aber, dass das "on-for-timer" auf dem sendenden MQTT_DEVICE sehe ich das "on-for-timer" aber, vermutlich rückwärtsherum, wieder ankommen.

Readings
on-for-timer  5  2015-06-12 18:25:55
state  off  2015-06-12 18:25:44
transmission-state  outgoing publish sent  2015-06-12 18:25:55


Ist bestimmt nur wieder eine Kleinigkeit, die ich wieder nicht verstanden habe....
Vielleicht hat jemand einen Tip für mich...

Vielen Dank
FHEM auf: DS415+ (Master), Raspberry Pi 2

Pf@nne

Mit toggle funktioniert es, blink geht übrigens auch nicht....
define WP_Aktoren MQTT_DEVICE
attr WP_Aktoren IODev MQTT_Broker
attr WP_Aktoren alias WP Zirkulation
attr WP_Aktoren autoSubscribeReadings /Aktoren/WP/+
attr WP_Aktoren devStateIcon on:10px-kreis-rot off:10px-kreis-gruen
attr WP_Aktoren publishSet on off toggle /Aktoren/WP/state/set
attr WP_Aktoren room Aktoren
attr WP_Aktoren stateFormat state
attr WP_Aktoren subscribeReading_state /Aktoren/WP/state

define TimerZirkulation at +*00:00:02 { fhem("set WP_Aktoren toggle") if($hour>=5 && $hour<23) }
attr TimerZirkulation room Aktoren


Ich hoffe, es kann mir jemand helfen....
FHEM auf: DS415+ (Master), Raspberry Pi 2

Pf@nne

#2
Ich bin einen kleinen Schritt weiter.....

Der MQTT_BRIDGE-Device akzeptiert das on-for-timer!

#-----------------------------------
# I2C 0x20 OUTPUT
#-----------------------------------
define 0x20_prxPortA0 readingsProxy 0x20_icMCP23017:PortA0
attr 0x20_prxPortA0 alias WW Zirkulation
attr 0x20_prxPortA0 devStateIcon on:10px-kreis-rot off:10px-kreis-gruen
attr 0x20_prxPortA0 group OutputPorts
attr 0x20_prxPortA0 room Waermepumpe
attr 0x20_prxPortA0 setFn {($CMD eq "on")?"PortA0 on":"PortA0 off"}
attr 0x20_prxPortA0 setList on off
attr 0x20_prxPortA0 valueFn {($VALUE eq "on")?"on":"off"}

#-------------------------------------------
# MQTT
#-------------------------------------------
define MQTT_Zirkulation MQTT_BRIDGE 0x20_prxPortA0
attr MQTT_Zirkulation IODev MQTT_Broker
attr MQTT_Zirkulation alias Zirkulation
attr MQTT_Zirkulation group MQTT Aktoren
attr MQTT_Zirkulation publishState /Aktoren/WP/state/
attr MQTT_Zirkulation room MQTT
attr MQTT_Zirkulation stateFormat transmission-state
attr MQTT_Zirkulation subscribeSet /Aktoren/WP/state/set


Wenn von der MosquittoKonsole aus ein:
root@Raspberry203:~# mosquitto_pub -d -t /Aktoren/WP/state/set -m "on-for-timer 3"
publishe dann wird dies von der MQTT_BRIDGE an den I2C-Output weitergegeben.

Der Ausgang geht für 3 Sekunden auf ON

Somit ist mein Problem doch beim publish des MQTT_DEVICE zu suchen!
define WP_Aktoren MQTT_DEVICE
attr WP_Aktoren IODev MQTT_Broker
attr WP_Aktoren alias WP Zirkulation
attr WP_Aktoren autoSubscribeReadings /Aktoren/WP/+
attr WP_Aktoren devStateIcon on:10px-kreis-rot off:10px-kreis-gruen
attr WP_Aktoren publishSet on off on-for-timer /Aktoren/WP/state/set
attr WP_Aktoren room Aktoren
attr WP_Aktoren stateFormat state
attr WP_Aktoren subscribeReading_state /Aktoren/WP/state

speziel hier vermute ich einen Gedankenfehler:

attr WP_Aktoren publishSet on off on-for-timer /Aktoren/WP/state/set


Kennt sich denn niemand damit aus?? oder habe ich das Problem zu undeutlich oder unvollständig beschriben?

Kann doch kein alzu großes Problem sein....HILFE... :o

:) :)

EDIT:
Wenn ich jetzt in der MosquittoKonsole folgendes subscribe
root@Raspberry203:~# mosquitto_sub -d -t /Aktoren/WP/state/set
und im Device "WP_Aktoren MQTT_DEVICE" ein SET on-for-timer 3 auslöse kommt am Broker nichts an....


FHEM auf: DS415+ (Master), Raspberry Pi 2

Pf@nne

Ich habe es jetzt hin, wobei ich glaube, dass ich hier "von hinten durch die Brust ins Auge" geschossen habe....

define WP_Aktoren MQTT_DEVICE
attr WP_Aktoren IODev MQTT_Broker
attr WP_Aktoren alias WP Zirkulation
attr WP_Aktoren devStateIcon on:10px-kreis-rot off:10px-kreis-gruen
attr WP_Aktoren publishSet on off /Aktoren/WP/state/set
attr WP_Aktoren publishSet_OFT /Aktoren/WP/state/set
attr WP_Aktoren room Aktoren
attr WP_Aktoren stateFormat state
attr WP_Aktoren subscribeReading_state /Aktoren/WP/state


hier habe ich jetzt ein eigegenes publish angelegt:
attr WP_Aktoren publishSet_OFT /Aktoren/WP/state/set


Dieser kann dann z.B. über at angestoßen werden:

define TimerZirkulation at +*00:30:00 { fhem("set WP_Aktoren OFT on-for-timer 300") if($hour>=5 && $hour<23) }
attr TimerZirkulation room Aktoren


Verstanden habe ich es immer noch nicht!
Ist denn wirklich keiner da der sich meiner erbarmen kann?

MfG
Pf@nne
FHEM auf: DS415+ (Master), Raspberry Pi 2

Pf@nne

#4
Wieder ein Stück weiter.....

Wenn ich im im WEB-IF im Device ein "SET OFT on-for-timer 3" absetze [attr publishSet_OFT /Aktoren/WP/state/set], dann wird die erwartungsgemäß "gepublisht.


2015-06-20 23:52:20 MQTT_DEVICE WP_Aktoren OFT: on-for-timer 3
2015-06-20 23:52:20 MQTT_DEVICE WP_Aktoren transmission-state: outgoing publish sent
2015-06-20 23:52:20 MQTT_DEVICE WP_Aktoren transmission-state: incoming publish received
2015-06-20 23:52:20 MQTT_DEVICE WP_Aktoren on


Setze ich jetzt aber ein "SET on-for-timer 5"[attr WP_Aktoren publishSet on off on-for-timer /Aktoren/WP/state/set], dann ist im Event-LOG folgendes zu finden:


2015-06-20 23:52:25 MQTT_DEVICE WP_Aktoren on-for-timer: 5
2015-06-20 23:52:25 MQTT_DEVICE WP_Aktoren transmission-state: outgoing publish sent
2015-06-20 23:52:25 MQTT MQTT_Broker DISCONNECTED
2015-06-20 23:52:25 MQTT MQTT_Broker connection: connecting
2015-06-20 23:52:25 MQTT MQTT_Broker CONNECTED
2015-06-20 23:52:25 MQTT MQTT_Broker connection: connected
2015-06-20 23:52:25 MQTT_DEVICE WP_Aktoren transmission-state: subscribe sent


Das sieht mir nach einem Problem in der MQTT-Kommunikation aus, die Verbindung zum Broker wird getrennt und wieder neu hergestellt. Vermutlich kommt da etwas am Broker an, was dieser nicht erwartet......

Auf den ersten Blick (ohne jetzt schon in die 00_MQTT.pm gesehen zu haben) würde icg sagen, dass hier:
2015-06-20 23:52:20 MQTT_DEVICE WP_Aktoren OFT: on-for-timer 3
als PayloadData ein "on-for-timer 3" gesendet wird, was ja auch klappt, wobei hier:
2015-06-20 23:52:25 MQTT_DEVICE WP_Aktoren on-for-timer: 5

wohl nur eine "5" gesendet wird.

Ich werde mir morgen die Telegramme mal mit Wireshark ansehen.

Könnte mir jemand beim Debuggen der "00_MQTT.pm" behilflich sein?

Ich hoffe auf eure Unterstützung!

Gruß
Pf@nne
FHEM auf: DS415+ (Master), Raspberry Pi 2

Pf@nne

Ich habe jetzt mit Wireshark mal je ein funktionierendes Telegramm und ein nicht funktionierendes Telegramm mitgeschnitten.

geht:
(http://nne-mail.de/Paket%20OK.PNG)

geht nicht:
(http://nne-mail.de/Paket%20NOT%20OK.PNG)

Hier fehlt der komplette Topic!
Demnach steckt hier noch ein Bug drin.... der behoben werden sollte....

Das die Daten werden hier in der 10_MQTT_DEVICE.pm gesendet.
sub Set($$$@) {
  my ($hash,$name,$command,@values) = @_;
  return "Need at least one parameters" unless defined $command;
  return "Unknown argument $command, choose one of " . join(" ", map {$hash->{sets}->{$_} eq "" ? $_ : "$_:".$hash->{sets}->{$_}} sort keys %{$hash->{sets}})
    if(!defined($hash->{sets}->{$command}));
  my $msgid;
  if (@values) {
    my $value = join " ",@values;
    $msgid = send_publish($hash->{IODev}, topic => $hash->{publishSets}->{$command}->{topic}, message => $value, qos => $hash->{qos}, retain => $hash->{retain});
    readingsSingleUpdate($hash,$command,$value,1);
  } else {
    $msgid = send_publish($hash->{IODev}, topic => $hash->{publishSets}->{""}->{topic}, message => $command, qos => $hash->{qos}, retain => $hash->{retain});
    readingsSingleUpdate($hash,"state",$command,1);
  }
  $hash->{message_ids}->{$msgid}++ if defined $msgid;
  readingsSingleUpdate($hash,"transmission-state","outgoing publish sent",1);
  return undef;
}


Leider stecke ich in Perl nicht so tief drin wie ich gerne möchte, daher bin ich auf Hilfe angewiesen.
Vielleicht kann mich hier ein Perl-Crack unterstützen.....

Ich werde natürlich nach Möglichkeit unterstützen....

Gruß
Pf@nne
FHEM auf: DS415+ (Master), Raspberry Pi 2

cremofix

Hallo,
der Thread ist zwar schon ziemlich alt, vielleicht hilft aber dem einen oder anderen mein Lösungsweg.
Ich habe hier einen MQTT Funksteckdose (OBI1), die ich intervallmäßig schalten möchte, also alle 20 Minuten, für 5 Minuten ON.

Habe das in Anbetracht der fehlenden on-for-timer Option bei MQTT mit FHEM Bordmitteln gelöst:

define Intervall at +*00:20:00 {

fhem ("set OBI1 on");
fhem ("define obi1aus at +00:05:00 set OBI1 off")
}


funktioniert einwandfrei.
Viel Spaß
cremofix