AskSin++ Library

Begonnen von papa, 08 September 2016, 11:11:25

Vorheriges Thema - Nächstes Thema

McShire

Zitat von: tndx am 18 November 2020, 23:01:52
Hi,

ja, Du musst nur die Pinbelegung ggf. anpassen (Zeilen 31-37) und beim Kompilieren den entsprechenden ProMini auswählen.

Ich habe die PinBelegung folgendermaßen geändert
#define RELAY_PIN          17 //PD4 
#define BTN_PIN_1          14 //PD6
#define BTN_PIN_2          15  //PD0
#define LED_PIN            4  //PB0
#define CONFIG_BUTTON_PIN  8 //PD7
#define CS_PIN             0  //PB4
#define GDO0_PIN           0 //PD2

Kompilieren und Hochladen geht fehlerfrei.

Funktioniert leider nicht.
Weder eine Ausgabe am seriellen Monitor der Arduino IDE, noch irgendeine Reaktion im FHEM beim cfg-Btn und autocreate und der AskSinAnalyzer empfängt auch nichts von diesem Modul.

Was mache ich falsch?
Gruß
Werner

McShire

Es war auch die Änderung für die Schnittstelle zum CC1101 notwendig:

alt:
typedef LibSPI<CS_PIN> SPIType;
typedef Radio<SPIType, GDO0_PIN> RadioType;
typedef AvrSPI<10,11,12,13> RadioSPI;
typedef AskSin<StatusLed<LED_PIN>,BattSensor<AsyncMeter<InternalVCC>>,Radio<RadioSPI,2> > Hal;
typedef StatusLed<LED_PIN> LedType;
typedef AskSin<LedType, NoBattery, RadioType> Hal;

neu:
typedef AvrSPI<10,11,12,13> RadioSPI;
typedef AskSin<StatusLed<LED_PIN>,BattSensor<AsyncMeter<InternalVCC>>,Radio<RadioSPI,2> > Hal;

Jetzt ist ein device eingerichtet, pairen hat auch funktioniert.
Die Funktionen muss ich erst weiter verstehen, der  Status ist ein großes Fragezeichen.

Viele Grüße
Werner

McShire

Hallo alle zusammen,
ich habe den Sketch HM-LC-Sw2-FM auf der AskSinPP-Standardhardware ausprobiert.
Das funktioniert hervoragend. Die Relays können im FHEM-Web ein- und ausgeschaltet werden
und lokal kann per Tastendruck der Schaltzustand geändert werden.
Dazu benötigt man lokal einen bzw. zwei Taster.

Nun möchte ich lokal aber gern keine Taster sondern vorhandene Schalter verwenden,
d.h. der Schaltzustand der Relays soll sich jeweils bei der Betätigung des Schalters,
egal ob von Ein nach Aus oder von Aus nach Ein ändern (wie bei einer Wechselschaltung).
d.h. eine Änderung erfolgt bei Änderung des button_pin von low nach high und von high nach low.
Beim obigen Sketch wird bei dauerhaftem low immerzu longpressed gesendet, das sollte natürlich
bei Verwendung eines Schalters nicht sein.

Kennt jemand einen Sketch, mit dem man lokal Schalter verwenden kann oder weiß jemand,
wie man den obigen Sketch für diese Funktion verändern kann. Ein Kanal würde reichen.

Viele Grüße
Werner

tndx

Moin,

es gibt ja von eq-3 HM-SC-3-FM, die Schalterschnittstelle, dazu gibt es auch einen AskSin++-Sketch https://github.com/jp112sdl/Beispiel_AskSinPP/blob/master/examples/HM-SCI-3-FM/HM-SCI-3-FM.ino. Vielleicht kannst Du Dir da die Behandlung der Eingänge abgucken

McShire

Zitat von: tndx am 29 November 2020, 11:26:30
Moin,

es gibt ja von eq-3 HM-SC-3-FM, die Schalterschnittstelle, dazu gibt es auch einen AskSin++-Sketch https://github.com/jp112sdl/Beispiel_AskSinPP/blob/master/examples/HM-SCI-3-FM/HM-SCI-3-FM.ino. Vielleicht kannst Du Dir da die Behandlung der Eingänge abgucken

Vielen Dank für die Info.
Ich habe den Sketch erst mal so geflashed um eine Vorstellung davon zu haben.
Leider ist es mir nur gelungen, den Status von Sw1 auf open und closed zu ändern indem ich jeweils den Schalter von A0 (Pin14) gegen Masse geschlossen oder geöffnet habe.
SW2 und SW3 konnte ich leider nicht ändern. Ein Schalter wäre ja schon mal gut. Falls Du eine Lösung hast, wie man den Status der anderen SW ändert, wäre das toll.
Bei A1, A2 oder A3 ändert sich nichts, wird laut Arduino Monitor auch kein Telegramm an FHEM gesendet.

Wie ich dann den Teil für die Eingänge in das andere Modul übertragen kann, weiß ich noch nicht. Ich bin in dieser Programmstruktur Neuling und verstehe vieles nicht.
Falls jemand eine Idee hat würde das sehr helfen.
Gruß
Werner



papa

Der Code sieht eigentlich soweit gut aus. Schau doch mal im Homematic-Florum, ob Du da was findest.
https://homematic-forum.de/forum/viewforum.php?f=76
Dort ist auch Jerome sehr aktiv und hilft eigentlich immer gerne.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

McShire

Hallo papa,
vielen Dank für die Info.
Leider bin ich als Neuling mit der Programmstruktur von AskSinPP nicht vertraut
und verstehe nur wenig, da ich nicht alle Programmmodule in ihrer Bedeutung
nachverfolgen kann. Ein bisschen Kommentar wäre da sicher hilfreich.

Ich will mich aber nicht beschweren und nörgeln, sondern erst einmal allen,
die an AsksinPP und FHEM mitgearbeitet haben und vor allem auch den Nichtfachleuten
umfangreiche Hilfe geben, danken, dass sie ihre Zeit hierfür einsetzen. Das ist sicher
sehr zeitaufwendig und nicht ganz einfach.

Zurück zu meiner Aufgabe.
Da ich nicht alles verstehe, habe ich es jetzt auf die einfache, wenn auch nicht professionelle Art gelöst.
Den Code habe ich unten beigefügt.
Den Taster habe ich durch eine Verbindung eines digitalen Ausgangs zum Tasterpin ersetzt, und steuere diesen abhängig von der Veränderung der Schalterstellung. So funktioniert der Ausgang von Pin 7 wie ein Taster zum ground.
Hier der Code, falls jemand anders das auch mal gebrauchen kann.


//- -----------------------------------------------------------------------------------------------------------------------
// AskSin++  "HM-LC-Sw2-FM-WS-locSwitch-FHEM.ino"
// 2016-10-31 papa Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
// 2020-11-30 McShire modification for use of a switch instead of a button for local change of the actor-relay
//            connect switch to pin 16 (A2) and Ground
//- -----------------------------------------------------------------------------------------------------------------------

// define this to read the device id, serial and device type from bootloader section
// #define USE_OTA_BOOTLOADER

#define EI_NOTEXTERNAL
#include <EnableInterrupt.h>
#include <AskSinPP.h>
#include <LowPower.h>

#include <Switch.h>

// we use a Pro Mini
// Arduino pin for the LED
// D4 == PIN 4 on Pro Mini
#define LED_PIN 4
// Arduino pin for the config button
// B0 == PIN 8 on Pro Mini
#define CONFIG_BUTTON_PIN 8

//set to 0x01 if the RELAY should be switched on LOW level
#define LOW_ACTIVE 0x00 
#define RELAY1_PIN 5    // modified from A3, on my Experim.board LED2, to see relay state
#define RELAY2_PIN 6    // modified from A2

#define BUTTON1_PIN 14
#define BUTTON2_PIN 15

#define SWITCH1_PIN 9  // inserted McShire
#define BTN_PRESS_PIN 7 // connect Pin 7 to Pin 14, / is eq to press btn

// number of available peers per channel
#define PEERS_PER_CHANNEL 8

// all library classes are placed in the namespace 'as'
using namespace as;

// define all device properties
const struct DeviceInfo PROGMEM devinfo = {
  {0x12, 0x09, 0x01},     // Device ID
  "JPLCSw2001",           // Device Serial
  {0x00, 0x09},           // Device Model
  0x24,                   // Firmware Version
  as::DeviceType::Switch, // Device Type
  {0x01, 0x00}            // Info Bytes
};

/**
   Configure the used hardware
*/
typedef AvrSPI<10, 11, 12, 13> RadioSPI;
typedef AskSin<StatusLed<LED_PIN>, NoBattery, Radio<RadioSPI, 2> > Hal;

// setup the device with channel type and number of channels
typedef MultiChannelDevice<Hal, SwitchChannel<Hal, PEERS_PER_CHANNEL, List0>, 2> SwitchType;

// inserted by McShire
boolean localon = false;   // state of the Switch, true = on, false = off

Hal hal;
SwitchType sdev(devinfo, 0x20);
ConfigButton<SwitchType> cfgBtn(sdev);
InternalButton<SwitchType> btn1(sdev, 1);
InternalButton<SwitchType> btn2(sdev, 2);

void initPeerings (bool first) {
  // create internal peerings - CCU2 needs this
  if ( first == true ) {
    HMID devid;
    sdev.getDeviceID(devid);
    for ( uint8_t i = 1; i <= sdev.channels(); ++i ) {
      Peer ipeer(devid, i);
      sdev.channel(i).peer(ipeer);
    }
  }
}

void setup () {
  DINIT(57600, ASKSIN_PLUS_PLUS_IDENTIFIER);
  bool first = sdev.init(hal);
  sdev.channel(1).init(RELAY1_PIN, LOW_ACTIVE);
  sdev.channel(2).init(RELAY2_PIN, LOW_ACTIVE);

  buttonISR(cfgBtn, CONFIG_BUTTON_PIN);
  buttonISR(btn1, BUTTON1_PIN);
  buttonISR(btn2, BUTTON2_PIN);

  pinMode(9, INPUT_PULLUP); // inserted by McShire
  pinMode(14, INPUT_PULLUP);
  pinMode(7, OUTPUT);


  sdev.channels(2);
  initPeerings(first);
  sdev.initDone();
}

void loop() {
  bool worked = hal.runready();

  // The following block was inserted by McShire
  // replace pressbutton by set digitaloutput connected to buttonPin LOW
 
  if (localon == true) {              // switch was already on
     if (digitalRead(9) == LOW) {     // switch is on
         digitalWrite(7,HIGH);       // release button if pressed
     }
     else {                           // switch is off, but was on
         digitalWrite(7,LOW);        // press button, toggle relay
         localon = false;             // Switch state = off
     }
  }
  else    {                           // switch was already off
     if (digitalRead(9) == HIGH) {    // switch is off
        digitalWrite(7,HIGH);        // release button if pressed
     }
     else {                           // switch is on, but was off
         digitalWrite(7,LOW);        // press button, toggle relay
         localon = true;              // Switch state = on
     }
  }
 
  bool poll = sdev.pollRadio();
  if ( worked == false && poll == false ) {
    hal.activity.savePower<Idle<> >(hal);
  }
}


Viele Grüße
Werner

McShire

Nachtrag:
Im Kommentar steht noch Pin 16, das ist im Code geändert, es muss überall statt Pin 16 jetzt Pin 9 heißen.

McShire

Nun kann ich meine vorhandenen Lichtschalter behalten, um das Licht lokal an- und auszuschalten und dahinter preisgünstig selbst gebaute Aktoren zur Steuerung durch FHEM setzen.

papa

Coole Lösung - hat mich direkt auf eine Idee gebracht.
Ich habe die InternalButton-Klasse um eine shortPress() Methode erweitert. Damit kann per Software ein kurzer Tastendruck ausgelöst werden. Das erspart Dir das Verbinden und Schalten des extra Pins. Im Prinzip sollte es reichen, wenn Du bei jedem Wechsel des Schalters ein shortPress() auslöst.

Kannst Du ja mal probieren, wenn Du magst.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

McShire

Hallo papa
Werde ich gerne probieren.
Aber leider weiß ich nicht, wo ich dazu den Schalter verbinden muss und was ich dazu in FHEM bzw. im Sketch machen muss.
Wie gesagt, ich bin ziemlich unbedarft und freue mich schon, wenn ich in der objektorientierten Programmierung verstehe, was eine Klasse ist.
Viele Grüße
Werner

papa

 
  if (localon == true) {               // switch was already on
     if (digitalRead(9) == HIGH) { // switch is off
         btn1.shortPress();           // short press for toggle
         localon = false;                // Switch state = off
     }
  }
  else  {                                   // switch was already off
     if (digitalRead(9) == LOW) { // switch is off
         btn1.shortPress();           // short press for toggle
         localon = true;                // Switch state = on
     }
  }


oder sogar noch kürzer

if( localon != digitalRead(9) ) {
  localon = !localon;
  btn1.shortPress();
}


Allerdings darf der Schalter bei beiden Lösungen nicht prellen.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

McShire

Hallo papa,
Die Kurzform gefällt mir am besten, tolle Lösung.
Wird denn short press im nachfolgendem Programmdurchlauf erkannt?
Ich habe den button pin immer extra einen Programmdurchlauf LOW gehalten.
So langsam beginne ich zu verstehen, es ist auch eine Frage der Vokabeln.
Für das Entprellen hilft sicher vor dem btn1.shortPress() ein kurzes delay(100) o.ä.
Der Schaltzustand bleibt ja bis zum nächsten Umschalten erhalten.
Gruß
Werner

McShire

Zitat von: papa am 01 Dezember 2020, 08:32:03
Coole Lösung - hat mich direkt auf eine Idee gebracht.
Ich habe die InternalButton-Klasse um eine shortPress() Methode erweitert. Damit kann per Software ein kurzer Tastendruck ausgelöst werden. Das erspart Dir das Verbinden und Schalten des extra Pins. Im Prinzip sollte es reichen, wenn Du bei jedem Wechsel des Schalters ein shortPress() auslöst.

Kannst Du ja mal probieren, wenn Du magst.

Wie bekomme ich die erweiterte InternalButton-Class?
In der bestehenden Class ist die Methode nicht enthalten.
Gruß
Werner

papa

Du musst die AskSin++ Library aktualisieren.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire