[gelöst] on-for-timer schaltet nicht ab

Begonnen von rob, 03 Juli 2020, 22:01:46

Vorheriges Thema - Nächstes Thema

rob

Hallo.

Im Original-Fred passt meine Frage nicht so richtig, deshalb kurzerhand als eigener.

Zitat von: Beta-User am 14 Mai 2020, 13:36:32
...Es gibt auch erweiterte Möglichkeiten, wenn man das Relais zum state-Reading erklärt, wie es das attrTemplate "A_24a_Relay_Actuator" exemplarisch für status1 vorführt (es kann aber immer nur eines geben, das man so "bevorzugt"). Jedenfalls: dann kann man auch "set MYSENSORS_0 on-for-timer 60" nehmen, um das Relais eine Minute anzumachen, und mit dem attrTemplate sieht man dann auch, dass ein timer läuft ;) ...

Ich hab ein Test-Funk-GW mit lokal 3x Reedkontakten und 2x Aktoren. Status empfangen klappt 1A. On + Off d. Aktoren klappt 1A.
Laut Commandref u. obigem Hinweis bekomme ich via setCommands + setExtensionsEvent Dinge wie on-for-timer. Ich habs kurzerhand via Template eingerichtet und status1 auf status5 geändert (weil das mein Gong-Aktor ist).

z.B. on-for-timer 5 schaltet auch on, aber es kommt kein off. Im Event-Monitor sehe ich nur das on, sonst tut sich nix. Off-for-timer analog: schaltet off, aber nicht mehr on. Irgendwas hab ich also falsch gemacht. Muss ich ggf. im Sketch anders auf receive reagieren?

ein List vom GW-Node:

Internals:
   DEF        0
   FUUID      5eef7fff-f33f-a385-416a-3d9d0e17b5c086fc
   IODev      testMySensorsGW
   I_RSSI     1
   NAME       MYSENSOR_0
   NR         315
   STATE      off
   TYPE       MYSENSORS_DEVICE
   ack        1
   radioId    0
   repeater   1
   version    2.3.2
   OLDREADINGS:
   READINGS:
     2020-07-02 17:44:50   SKETCH_NAME     Gateway Nrf mit Sensoren
     2020-07-02 17:44:50   SKETCH_VERSION  1.0
     2020-07-03 09:23:15   attrTemplateVersion 20200522 or prior
     2020-07-03 20:53:37   heartbeat       alive
     2020-07-02 22:53:53   klingel_LED     off
     2020-07-03 09:37:57   state           off
     2020-07-02 17:44:56   status1         on
     2020-07-02 17:45:09   status2         on
     2020-07-03 09:37:57   status5         off
   gets:
   readingMappings:
     1:
       2:
         name       status1
     2:
       2:
         name       status2
     3:
       2:
         name       klingel_BUTTON
     4:
       2:
         name       klingel_LED
     5:
       2:
         name       status5
   retainedMessagesForRadioId:
   setcommands:
     off:
       val        off
       var        status5
     on:
       val        on
       var        status5
   sets:
     clear      noArg
     flash      noArg
     fwType     
     klingel_BUTTON off,on
     klingel_LED off,on
     off       
     on         
     reboot     noArg
     status1    off,on
     status2    off,on
     status5    off,on
     time       noArg
Attributes:
   IODev      testMySensorsGW
   devStateIcon .*on:on .*off:off on.(for.timer|till.*):on-for-timer:off off.(for.timer|till.*):off-for-timer:on blink.*:light_toggle:off
   mapReading_klingel_BUTTON 3 status
   mapReading_klingel_LED 4 status
   mapReading_status1 1 status
   mapReading_status2 2 status
   mapReading_status5 5 status
   mode       repeater
   model      Relay_Actuator
   requestAck 1
   room       MYSENSORS_DEVICE
   setCommands on:status5:on off:status5:off
   setExtensionsEvent 1
   setReading_klingel_BUTTON off,on
   setReading_klingel_LED off,on
   setReading_status1 off,on
   setReading_status2 off,on
   setReading_status5 off,on
   verbose    0


mein Testsketch:

// Enable debug prints to serial monitor
#define MY_DEBUG

// Enable and select radio type attached
#define MY_RADIO_RF24
//#define MY_RADIO_NRF5_ESB
//#define MY_RADIO_RFM69
//#define MY_RADIO_RFM95

// Set LOW transmit power level as default, if you have an amplified NRF-module and
// power your radio separately with a good regulator you can turn up PA level.
#define MY_RF24_PA_LEVEL RF24_PA_LOW

// Enable serial gateway
#define MY_GATEWAY_SERIAL

// Define a lower baud rate for Arduinos running on 8 MHz (Arduino Pro Mini 3.3V & SenseBender)
#if F_CPU == 8000000L
#define MY_BAUD_RATE 38400
#endif

// Enable inclusion mode
#define MY_INCLUSION_MODE_FEATURE
// Enable Inclusion mode button on gateway
#define MY_INCLUSION_BUTTON_FEATURE

// Inverses behavior of inclusion button (if using external pullup)
//#define MY_INCLUSION_BUTTON_EXTERNAL_PULLUP

// Set inclusion mode duration (in seconds)
#define MY_INCLUSION_MODE_DURATION 60
// Digital pin used for inclusion mode button
#define MY_INCLUSION_MODE_BUTTON_PIN  3

// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 300

// Inverses the behavior of leds
//#define MY_WITH_LEDS_BLINKING_INVERSE

// Flash leds on rx/tx/err
// Uncomment to override default HW configurations
#define MY_DEFAULT_ERR_LED_PIN 4  // Error led pin
#define MY_DEFAULT_RX_LED_PIN  6  // Receive led pin
#define MY_DEFAULT_TX_LED_PIN  5  // the PCB, on board LED

#include <MySensors.h>
#include <Bounce2.h>

//child id für buttons
#define button_ID1 1
#define button_ID2 2
#define button_ID3 3
#define ledout_id 4
#define chimeout_id 5

#define button1_pin  7
#define button2_pin  8
#define button3_pin  14
#define ledout_pin  15
#define chimeout_pin  16

#define PIN_ON 1
#define PIN_OFF 0

Bounce debouncer1 = Bounce();
Bounce debouncer2 = Bounce();
Bounce debouncer3 = Bounce();

int oldValue1=0;
int oldValue2=0;
int oldValue3=0;

bool led_state;
bool chime_state;

int sensor_num=0;

// Change to V_LIGHT if you use S_LIGHT in presentation below
MyMessage msg1(button_ID1,V_LIGHT);
MyMessage msg2(button_ID2,V_LIGHT);
MyMessage msg3(button_ID3,V_LIGHT);
MyMessage msg4(ledout_id,V_LIGHT); //report back state
MyMessage msg5(chimeout_id,V_LIGHT); //report back state

void setup()
{
  // Setup the buttons
  pinMode(button1_pin,INPUT);
  pinMode(button2_pin,INPUT);
  pinMode(button3_pin,INPUT);
 
  // Activate internal pull-up
  digitalWrite(button1_pin,HIGH);
  digitalWrite(button2_pin,HIGH);
  digitalWrite(button3_pin,HIGH);

  // After setting up the button, setup debouncer
  debouncer1.attach(button1_pin);
  debouncer1.interval(5);

  debouncer2.attach(button2_pin);
  debouncer2.interval(5);

  debouncer3.attach(button3_pin);
  debouncer3.interval(5);

  // Make sure outs are off when starting up
  digitalWrite(ledout_pin, PIN_OFF);
  digitalWrite(chimeout_pin, PIN_OFF);
  // Then set pins in output mode
  pinMode(ledout_pin, OUTPUT);
  pinMode(chimeout_pin, OUTPUT);
  // Set pin to last known state (using eeprom storage)
  led_state = loadState(ledout_id);
  digitalWrite(ledout_pin, led_state?PIN_ON:PIN_OFF);
  chime_state = loadState(chimeout_id);
  digitalWrite(chimeout_pin, chime_state?PIN_ON:PIN_OFF);

}

void presentation()
{
  sendSketchInfo("Gateway Nrf mit Sensoren", "1.0");
  present(button_ID1, S_LIGHT);
  present(button_ID2, S_LIGHT);
  present(button_ID3, S_LIGHT);
  present(ledout_id, S_LIGHT);
  present(chimeout_id, S_LIGHT);
}

void loop()
{
  debouncer1.update();
  // Get the update value
  int value1 = debouncer1.read();
  if (value1 != oldValue1) {
      send(msg1.set(value1==HIGH ? 1:0), true); // Send new state and request ack back
     oldValue1 = value1;
  }

  debouncer2.update();
  // Get the update value
  int value2 = debouncer2.read();
  if (value2 != oldValue2) {
      send(msg2.set(value2==HIGH ? 1:0), true); // Send new state and request ack back
     oldValue2 = value2;
  }

  debouncer3.update();
  // Get the update value
  int value3 = debouncer3.read();
  if (value3 != oldValue3) {
      send(msg3.set(value3==HIGH ? 1:0), true); // Send new state and request ack back
     oldValue3 = value3;
  }
}

void receive(const MyMessage &message) {
  // We only expect one type of message from controller. But we better check anyway.
  if (message.isAck()) {
     Serial.println("This is an ack from gateway");
  }

  if (message.type == V_LIGHT) {
    sensor_num = message.getSensor();
    switch (sensor_num) {
      case 4:
        led_state = message.getBool();
        digitalWrite(ledout_pin, led_state?PIN_ON:PIN_OFF);
        send(msg4.set(led_state?PIN_ON:PIN_OFF));
        // Store state in eeprom
        saveState(ledout_id, led_state);
        break;
      case 5:
        chime_state = message.getBool();
        digitalWrite(chimeout_pin, chime_state?PIN_ON:PIN_OFF);
        send(msg5.set(chime_state?PIN_ON:PIN_OFF));
        // Store state in eeprom
        saveState(chimeout_id, chime_state);
        break;
      default:
        break;
    }
  }
}


Natürlich kann ich auch DOIF mit wait oder ein notify mit at usw. nehmen oder direkt im Sketch umsetzen. Ich möchte nur gern verstehen, warum mein on-for-timer nur ein aber nicht abschaltet  ;) Könnte mir bitte jmd. die Tomaten von den Augen nehmen?  ;D

Vielen Dank und beste Grüße
rob

Beta-User

hmm, also, habe eben nochmal "blink" und on-for-timer getestet, und jedenfalls nach dem Event-Monitor macht das genau das, was es soll:

2020-07-03 23:31:23 MYSENSORS_DEVICE MYSENSOR_95 status_Rechts: on
2020-07-03 23:31:23 MYSENSORS_DEVICE MYSENSOR_95 blink 5 2
2020-07-03 23:31:25 MYSENSORS_DEVICE MYSENSOR_95 status_Rechts: off
2020-07-03 23:31:25 MYSENSORS_DEVICE MYSENSOR_95 blink 5 2 1
2020-07-03 23:31:27 MYSENSORS_DEVICE MYSENSOR_95 status_Rechts: on
2020-07-03 23:31:27 MYSENSORS_DEVICE MYSENSOR_95 blink 4 2 0
2020-07-03 23:31:29 MYSENSORS_DEVICE MYSENSOR_95 status_Rechts: off
2020-07-03 23:31:29 MYSENSORS_DEVICE MYSENSOR_95 blink 4 2 1
2020-07-03 23:31:31 MYSENSORS_DEVICE MYSENSOR_95 status_Rechts: on
2020-07-03 23:31:31 MYSENSORS_DEVICE MYSENSOR_95 blink 3 2 0
2020-07-03 23:31:33 MYSENSORS_DEVICE MYSENSOR_95 status_Rechts: off
2020-07-03 23:31:33 MYSENSORS_DEVICE MYSENSOR_95 blink 3 2 1
2020-07-03 23:31:35 MYSENSORS_DEVICE MYSENSOR_95 status_Rechts: on
2020-07-03 23:31:35 MYSENSORS_DEVICE MYSENSOR_95 blink 2 2 0
2020-07-03 23:31:37 MYSENSORS_DEVICE MYSENSOR_95 status_Rechts: off
2020-07-03 23:31:37 MYSENSORS_DEVICE MYSENSOR_95 blink 2 2 1
2020-07-03 23:31:39 MYSENSORS_DEVICE MYSENSOR_95 status_Rechts: on
2020-07-03 23:31:39 MYSENSORS_DEVICE MYSENSOR_95 blink 1 2 0
2020-07-03 23:31:41 MYSENSORS_DEVICE MYSENSOR_95 status_Rechts: off
2020-07-03 23:31:41 MYSENSORS_DEVICE MYSENSOR_95 off
2020-07-03 23:39:24 MYSENSORS_DEVICE MYSENSOR_95 status_Rechts: on
2020-07-03 23:39:24 MYSENSORS_DEVICE MYSENSOR_95 on-for-timer 5
2020-07-03 23:39:29 MYSENSORS_DEVICE MYSENSOR_95 status_Rechts: off
2020-07-03 23:39:29 MYSENSORS_DEVICE MYSENSOR_95 off

Fazit: Das funktioniert grundsätzlich, jedenfalls von der FHEM-Seite her. Und wenn das Device (unter dem gemappten Reading/setter) "on" und "off" versteht, sollte das auch klappen.

Allerdings kann ich weder in der geposteten Config noch im Sketch irgendwas erkennen, warum das nicht klappen sollte.

Zur Info: das MYS-Modul gibt nur die Kontrolle an SetExtensions ab, wenn es selbst für bestimmte Setter nichts findet, deswegen klappt auch attrTemplate. Klingt für mich danach, als wäre das auch in anderen Fällen "kaputt" und würde mal empfehlen, es mit einem Dummy zu testen.

Hier noch der relevante Auszug aus meiner zugehörigen RAW-Config:
defmod MYSENSOR_95 MYSENSORS_DEVICE 95
attr MYSENSOR_95 mapReading_status_Links 1 status
attr MYSENSOR_95 mapReading_status_Mitte 2 status
attr MYSENSOR_95 mapReading_status_Pumpe 4 status
attr MYSENSOR_95 mapReading_status_Rechts 3 status
attr MYSENSOR_95 setCommands on:status_Rechts:on off:status_Rechts:off
attr MYSENSOR_95 setExtensionsEvent 1
attr MYSENSOR_95 setReading_power_Links 1
attr MYSENSOR_95 setReading_power_Mitte 1
attr MYSENSOR_95 setReading_power_Pumpe 1
attr MYSENSOR_95 setReading_power_Rechts 1
attr MYSENSOR_95 setReading_status_Links on,off
attr MYSENSOR_95 setReading_status_Mitte on,off
attr MYSENSOR_95 setReading_status_Pumpe on,off
attr MYSENSOR_95 setReading_status_Rechts on,off
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rob

Hi. Ich danke Dir die flinke Info und fürs Gegenchecken.

Habs gschwind geprüft. Scheint sonst OK.

Eventmonitor dummy mit on-for-timer 5 --> funktioniert

2020-07-04 10:42:45 Global global ATTR testdummy setList on off
2020-07-04 10:43:18 Global global ATTR testdummy useSetExtensions 1
2020-07-04 10:43:31 dummy testdummy on //manuell on
2020-07-04 10:43:42 dummy testdummy on //on-for-timer 5
2020-07-04 10:43:47 dummy testdummy off


nochmal mit config-firmata pin14 --> läuft auch

2020-07-04 10:49:23 FRM_OUT ArduPin14 value: on //manuell on
2020-07-04 10:49:34 FRM_OUT ArduPin14 value: on //on-for-timer 5
2020-07-04 10:49:39 FRM_OUT ArduPin14 value: off


spaßenshalber habe ich mal setCommands auf einen der Reed-Kontakte definiert, weil die im Sketch nicht von receive() behandelt werden

attr MYSENSOR_0 setCommands on:status1:on off:status1:off


und dann on-for-timer --> funktioniert

2020-07-04 11:07:58 MYSENSORS_DEVICE MYSENSOR_0 heartbeat: alive
2020-07-04 11:08:27 MYSENSORS_DEVICE MYSENSOR_0 status1: on
2020-07-04 11:08:27 MYSENSORS_DEVICE MYSENSOR_0 on-for-timer 5
2020-07-04 11:08:32 MYSENSORS_DEVICE MYSENSOR_0 status1: off
2020-07-04 11:08:32 MYSENSORS_DEVICE MYSENSOR_0 off

Im WebIcon wird auch brav der Timer angezeigt.

jetzt nochmal zurück auf den Aktor --> not OK

2020-07-04 11:14:30 Global global ATTR MYSENSOR_0 setCommands on:status5:on off:status5:off
2020-07-04 11:14:47 MYSENSORS_DEVICE MYSENSOR_0 status5: on
2020-07-04 11:14:47 MYSENSORS_DEVICE MYSENSOR_0 on-for-timer 5
2020-07-04 11:14:47 MYSENSORS_DEVICE MYSENSOR_0 status5: on
2020-07-04 11:14:47 MYSENSORS_DEVICE MYSENSOR_0 on

Das WebIcon ändert sich auf on, aber kein Timersymbol. Stutzig macht mich, dass im EventMon 3x on erscheint. So also würde das zurückgemeldete on wieder ein event auslösen und somit den timer aufheben.

Ich muss also in der receive() mal testen, ob die Report-Back-Geschichte so richtig ist. Ich fand es ganz nice, na mal schauen.

Danke und viele Grüße
rob

frober

Mmn stört unter receive das Senden des Status.
Wenn man aus Fhem den Status setzt, wird das Device auch direkt oder nach ACK ok auf den Status gesetzt.
Eine Rückmeldung aus der Node wäre hier ein doppeltes Setzen des Status und setzt vermutlich den Timer zurück.

Ich habe in meinen Sketche nur die sendmsg wenn ich direkt in der Node den Status setze, also nicht in receive!

Grüße Bernd
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

rob

Danke dir Bernd. Damit sehe ich meine Vermutung bestätigt.

Anfangs hatte ich send() auch nicht in der receive-Funktion drin. Schalten und walten ging, bei den Aktoren änderte sich aber das Reading nicht. weshalb ich mein "SendBack" einbaute.

Jetzt habe ich send() auskommentiert, neugeflasht und nun macht es wie es soll --> auch on-for-timer.

switch (sensor_num) {
      case 4:
        led_state = message.getBool();
        digitalWrite(ledout_pin, led_state?PIN_ON:PIN_OFF);
        //send(msg4.set(led_state?PIN_ON:PIN_OFF));
        // Store state in eeprom
        saveState(ledout_id, led_state);
        break;
      case 5:
        chime_state = message.getBool();
        digitalWrite(chimeout_pin, chime_state?PIN_ON:PIN_OFF);
        //send(msg5.set(chime_state?PIN_ON:PIN_OFF));
        // Store state in eeprom
        saveState(chimeout_id, chime_state);
        break;

Die Readings ändern sich auch wie angedacht  :o Warum die Readings sich anfangs nicht änderten, kann ich nicht mehr nachvollziehen. Vermutlich hatte ich noch einen anderen Fehler im Sketch.

Jetzt sind die Tomaten weg und ich habe verstanden was ich falsch gemacht hatte. Sehr schön  8)

Vielen Dank und beste Grüße
rob

frober

Du hast requestACK aktiviert, dadurch geht der Status erst auf on/Off wenn die Rückmeldung durch die Node kommt.

Freut mich, dass ich helfen konnte.
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...