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
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
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
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
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
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.