mirror of https://github.com/arendst/Tasmota.git
Berry i2c improvements (#11497)
* Berry i2c improvements * fix * unfix Co-authored-by: Stephan Hadinger <stephan.hadinger@gmail.com>
This commit is contained in:
parent
e7a851f197
commit
1bd593eda3
|
@ -1843,6 +1843,104 @@ const bclosure load_closure = {
|
||||||
|
|
||||||
/*******************************************************************/
|
/*******************************************************************/
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
// tasmota.wire_scan(addr:int [, index:int]) -> wire1 or wire2 or nil
|
||||||
|
// scan for the first occurrence of the addr, starting with bus1 then bus2
|
||||||
|
// optional: skip if index is disabled via I2CEnable
|
||||||
|
"def wire_scan(addr,idx) "
|
||||||
|
// skip if the I2C index is disabled
|
||||||
|
"if idx != nil && !self.i2c_enabled(idx) return nil end "
|
||||||
|
"if self.wire1.detect(addr) return self.wire1 end "
|
||||||
|
"if self.wire2.detect(addr) return self.wire2 end "
|
||||||
|
"return nil "
|
||||||
|
"end "
|
||||||
|
********************************************************************/
|
||||||
|
/********************************************************************
|
||||||
|
** Solidified function: wire_scan
|
||||||
|
********************************************************************/
|
||||||
|
|
||||||
|
be_define_local_const_str(wire_scan_str_name, "wire_scan", -1623691416, 0, 9, 0);
|
||||||
|
be_define_local_const_str(wire_scan_str_source, "string", 398550328, 0, 6, 0);
|
||||||
|
be_define_local_const_str(wire_scan_str_0, "i2c_enabled", 218388101, 0, 11, 0);
|
||||||
|
be_define_local_const_str(wire_scan_str_1, "wire1", -1082245877, 0, 5, 0);
|
||||||
|
be_define_local_const_str(wire_scan_str_2, "detect", 8884370, 0, 6, 0);
|
||||||
|
be_define_local_const_str(wire_scan_str_3, "wire2", -1065468258, 0, 5, 0);
|
||||||
|
|
||||||
|
static const bvalue wire_scan_ktab[4] = {
|
||||||
|
{ { .s=be_local_const_str(wire_scan_str_0) }, BE_STRING},
|
||||||
|
{ { .s=be_local_const_str(wire_scan_str_1) }, BE_STRING},
|
||||||
|
{ { .s=be_local_const_str(wire_scan_str_2) }, BE_STRING},
|
||||||
|
{ { .s=be_local_const_str(wire_scan_str_3) }, BE_STRING},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint32_t wire_scan_code[25] = {
|
||||||
|
0x4C0C0000, // 0000 LDNIL 3
|
||||||
|
0x200C0403, // 0001 NE R3 R2 R3
|
||||||
|
0x780E0005, // 0002 JMPF R3 #0009
|
||||||
|
0x8C0C0100, // 0003 GETMET R3 R0 R256
|
||||||
|
0x5C140400, // 0004 MOVE R5 R2
|
||||||
|
0x7C0C0400, // 0005 CALL R3 2
|
||||||
|
0x740E0001, // 0006 JMPT R3 #0009
|
||||||
|
0x4C0C0000, // 0007 LDNIL 3
|
||||||
|
0x80040600, // 0008 RET 1 R3
|
||||||
|
0x880C0101, // 0009 GETMBR R3 R0 R257
|
||||||
|
0x8C0C0702, // 000A GETMET R3 R3 R258
|
||||||
|
0x5C140200, // 000B MOVE R5 R1
|
||||||
|
0x7C0C0400, // 000C CALL R3 2
|
||||||
|
0x780E0001, // 000D JMPF R3 #0010
|
||||||
|
0x880C0101, // 000E GETMBR R3 R0 R257
|
||||||
|
0x80040600, // 000F RET 1 R3
|
||||||
|
0x880C0103, // 0010 GETMBR R3 R0 R259
|
||||||
|
0x8C0C0702, // 0011 GETMET R3 R3 R258
|
||||||
|
0x5C140200, // 0012 MOVE R5 R1
|
||||||
|
0x7C0C0400, // 0013 CALL R3 2
|
||||||
|
0x780E0001, // 0014 JMPF R3 #0017
|
||||||
|
0x880C0103, // 0015 GETMBR R3 R0 R259
|
||||||
|
0x80040600, // 0016 RET 1 R3
|
||||||
|
0x4C0C0000, // 0017 LDNIL 3
|
||||||
|
0x80040600, // 0018 RET 1 R3
|
||||||
|
};
|
||||||
|
|
||||||
|
static const bproto wire_scan_proto = {
|
||||||
|
NULL, // bgcobject *next
|
||||||
|
8, // type
|
||||||
|
GC_CONST, // marked
|
||||||
|
6, // nstack
|
||||||
|
0, // nupvals
|
||||||
|
3, // argc
|
||||||
|
0, // varg
|
||||||
|
NULL, // bgcobject *gray
|
||||||
|
NULL, // bupvaldesc *upvals
|
||||||
|
(bvalue*) &wire_scan_ktab, // ktab
|
||||||
|
NULL, // bproto **ptab
|
||||||
|
(binstruction*) &wire_scan_code, // code
|
||||||
|
be_local_const_str(wire_scan_str_name), // name
|
||||||
|
25, // codesize
|
||||||
|
4, // nconst
|
||||||
|
0, // nproto
|
||||||
|
be_local_const_str(wire_scan_str_source), // source
|
||||||
|
#if BE_DEBUG_RUNTIME_INFO /* debug information */
|
||||||
|
NULL, // lineinfo
|
||||||
|
0, // nlineinfo
|
||||||
|
#endif
|
||||||
|
#if BE_DEBUG_VAR_INFO
|
||||||
|
NULL, // varinfo
|
||||||
|
0, // nvarinfo
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static const bclosure wire_scan_closure = {
|
||||||
|
NULL, // bgcobject *next
|
||||||
|
36, // type
|
||||||
|
GC_CONST, // marked
|
||||||
|
0, // nupvals
|
||||||
|
NULL, // bgcobject *gray
|
||||||
|
(bproto*) &wire_scan_proto, // proto
|
||||||
|
{ NULL } // upvals
|
||||||
|
};
|
||||||
|
|
||||||
|
/*******************************************************************/
|
||||||
|
|
||||||
|
|
||||||
/********************************************************************
|
/********************************************************************
|
||||||
|
|
||||||
|
@ -1858,6 +1956,8 @@ void be_load_tasmota_ntvlib(bvm *vm)
|
||||||
{ "_timers", NULL },
|
{ "_timers", NULL },
|
||||||
{ "_cmd", NULL },
|
{ "_cmd", NULL },
|
||||||
{ "_drivers", NULL },
|
{ "_drivers", NULL },
|
||||||
|
{ "wire1", NULL },
|
||||||
|
{ "wire2", NULL },
|
||||||
{ "get_free_heap", l_getFreeHeap },
|
{ "get_free_heap", l_getFreeHeap },
|
||||||
{ "publish", l_publish },
|
{ "publish", l_publish },
|
||||||
{ "cmd", l_cmd },
|
{ "cmd", l_cmd },
|
||||||
|
@ -1902,6 +2002,7 @@ void be_load_tasmota_ntvlib(bvm *vm)
|
||||||
{ "event", (bntvfunc) &event_closure },
|
{ "event", (bntvfunc) &event_closure },
|
||||||
{ "add_driver", (bntvfunc) &add_driver_closure },
|
{ "add_driver", (bntvfunc) &add_driver_closure },
|
||||||
{ "load", (bntvfunc) &load_closure },
|
{ "load", (bntvfunc) &load_closure },
|
||||||
|
{ "wire_scan", (bntvfunc) &wire_scan_closure },
|
||||||
|
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
|
@ -212,7 +212,7 @@ const bclosure write_bytes_closure = {
|
||||||
void be_load_wirelib(bvm *vm)
|
void be_load_wirelib(bvm *vm)
|
||||||
{
|
{
|
||||||
static const bnfuncinfo members[] = {
|
static const bnfuncinfo members[] = {
|
||||||
{ "_bus", NULL }, // bus number
|
{ "bus", NULL }, // bus number
|
||||||
{ "init", b_wire_init },
|
{ "init", b_wire_init },
|
||||||
{ "_begin_transmission", b_wire_begintransmission },
|
{ "_begin_transmission", b_wire_begintransmission },
|
||||||
{ "_end_transmission", b_wire_endtransmission },
|
{ "_end_transmission", b_wire_endtransmission },
|
||||||
|
|
|
@ -6,62 +6,53 @@
|
||||||
-#
|
-#
|
||||||
|
|
||||||
class MPU6886 : Driver
|
class MPU6886 : Driver
|
||||||
var enabled, wire
|
var wire #- if wire == nil then the module is not initialized -#
|
||||||
var gres, ares
|
var gres, ares
|
||||||
var accel, gyro
|
var accel, gyro
|
||||||
|
|
||||||
def init()
|
def init()
|
||||||
self.enabled = false
|
self.wire = tasmota.wire_scan(0x68, 58)
|
||||||
if tasmota.i2c_enabled(58) || 1
|
|
||||||
var bus = 1
|
|
||||||
if wire1.detect(0x68)
|
|
||||||
self.wire = wire1
|
|
||||||
elif wire2.detect(0x68)
|
|
||||||
self.wire = wire2
|
|
||||||
bus = 2
|
|
||||||
end
|
|
||||||
|
|
||||||
if self.wire
|
if self.wire
|
||||||
var v = self.wire.read(0x68,0x75,1)
|
var v = self.wire.read(0x68,0x75,1)
|
||||||
if v != 0x19 return end #- wrong device -#
|
if v != 0x19 return end #- wrong device -#
|
||||||
|
|
||||||
self.wire.write(0x68, 0x6B, 0, 1)
|
self.wire.write(0x68, 0x6B, 0, 1)
|
||||||
tasmota.delay(10)
|
tasmota.delay(10)
|
||||||
self.wire.write(0x68, 0x6B, 1<<7, 1) # MPU6886_PWR_MGMT_1
|
self.wire.write(0x68, 0x6B, 1<<7, 1) # MPU6886_PWR_MGMT_1
|
||||||
tasmota.delay(10)
|
tasmota.delay(10)
|
||||||
self.wire.write(0x68, 0x6B, 1<<0, 1) # MPU6886_PWR_MGMT_1
|
self.wire.write(0x68, 0x6B, 1<<0, 1) # MPU6886_PWR_MGMT_1
|
||||||
tasmota.delay(10)
|
tasmota.delay(10)
|
||||||
self.wire.write(0x68, 0x1C, 0x10, 1) # MPU6886_ACCEL_CONFIG - AFS_8G
|
self.wire.write(0x68, 0x1C, 0x10, 1) # MPU6886_ACCEL_CONFIG - AFS_8G
|
||||||
tasmota.delay(1)
|
tasmota.delay(1)
|
||||||
self.wire.write(0x68, 0x1B, 0x18, 1) # MPU6886_GYRO_CONFIG - GFS_2000DPS
|
self.wire.write(0x68, 0x1B, 0x18, 1) # MPU6886_GYRO_CONFIG - GFS_2000DPS
|
||||||
tasmota.delay(1)
|
tasmota.delay(1)
|
||||||
self.wire.write(0x68, 0x1A, 0x01, 1) # MPU6886_CONFIG
|
self.wire.write(0x68, 0x1A, 0x01, 1) # MPU6886_CONFIG
|
||||||
tasmota.delay(1)
|
tasmota.delay(1)
|
||||||
self.wire.write(0x68, 0x19, 0x05, 1) # MPU6886_SMPLRT_DIV
|
self.wire.write(0x68, 0x19, 0x05, 1) # MPU6886_SMPLRT_DIV
|
||||||
tasmota.delay(1)
|
tasmota.delay(1)
|
||||||
self.wire.write(0x68, 0x38, 0x00, 1) # MPU6886_INT_ENABLE
|
self.wire.write(0x68, 0x38, 0x00, 1) # MPU6886_INT_ENABLE
|
||||||
tasmota.delay(1)
|
tasmota.delay(1)
|
||||||
self.wire.write(0x68, 0x1D, 0x00, 1) # MPU6886_ACCEL_CONFIG2
|
self.wire.write(0x68, 0x1D, 0x00, 1) # MPU6886_ACCEL_CONFIG2
|
||||||
tasmota.delay(1)
|
tasmota.delay(1)
|
||||||
self.wire.write(0x68, 0x6A, 0x00, 1) # MPU6886_USER_CTRL
|
self.wire.write(0x68, 0x6A, 0x00, 1) # MPU6886_USER_CTRL
|
||||||
tasmota.delay(1)
|
tasmota.delay(1)
|
||||||
self.wire.write(0x68, 0x23, 0x00, 1) # MPU6886_FIFO_EN
|
self.wire.write(0x68, 0x23, 0x00, 1) # MPU6886_FIFO_EN
|
||||||
tasmota.delay(1)
|
tasmota.delay(1)
|
||||||
self.wire.write(0x68, 0x37, 0x22, 1) # MPU6886_INT_PIN_CFG
|
self.wire.write(0x68, 0x37, 0x22, 1) # MPU6886_INT_PIN_CFG
|
||||||
tasmota.delay(1)
|
tasmota.delay(1)
|
||||||
self.wire.write(0x68, 0x38, 0x01, 1) # MPU6886_INT_ENABLE
|
self.wire.write(0x68, 0x38, 0x01, 1) # MPU6886_INT_ENABLE
|
||||||
tasmota.delay(100)
|
tasmota.delay(100)
|
||||||
|
|
||||||
self.enabled = true
|
self.gres = 2000.0/32768.0
|
||||||
self.gres = 2000.0/32768.0
|
self.ares = 8.0/32678.0
|
||||||
self.ares = 8.0/32678.0
|
print("I2C: MPU6886 detected on bus "+str(self.wire.bus))
|
||||||
print("I2C: MPU6886 detected on bus "+str(bus))
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
#- returns a list of 3 axis, float as g acceleration -#
|
#- returns a list of 3 axis, float as g acceleration -#
|
||||||
def read_accel()
|
def read_accel()
|
||||||
|
if !self.wire return nil end #- exit if not initialized -#
|
||||||
var b = self.wire.read_bytes(0x68,0x3B,6)
|
var b = self.wire.read_bytes(0x68,0x3B,6)
|
||||||
var a1 = b.get(0,-2)
|
var a1 = b.get(0,-2)
|
||||||
if a1 >= 0x8000 a1 -= 0x10000 end
|
if a1 >= 0x8000 a1 -= 0x10000 end
|
||||||
|
@ -75,6 +66,7 @@ class MPU6886 : Driver
|
||||||
|
|
||||||
#- returns a list of 3 gyroscopes, int as dps (degree per second) -#
|
#- returns a list of 3 gyroscopes, int as dps (degree per second) -#
|
||||||
def read_gyro()
|
def read_gyro()
|
||||||
|
if !self.wire return nil end #- exit if not initialized -#
|
||||||
var b = self.wire.read_bytes(0x68,0x43,6)
|
var b = self.wire.read_bytes(0x68,0x43,6)
|
||||||
var g1 = b.get(0,-2)
|
var g1 = b.get(0,-2)
|
||||||
if g1 >= 0x8000 g1 -= 0x10000 end
|
if g1 >= 0x8000 g1 -= 0x10000 end
|
||||||
|
@ -88,17 +80,19 @@ class MPU6886 : Driver
|
||||||
|
|
||||||
#- trigger a read every second -#
|
#- trigger a read every second -#
|
||||||
def every_second()
|
def every_second()
|
||||||
|
if !self.wire return nil end #- exit if not initialized -#
|
||||||
self.read_accel()
|
self.read_accel()
|
||||||
self.read_gyro()
|
self.read_gyro()
|
||||||
end
|
end
|
||||||
|
|
||||||
#- display sensor value in the web UI -#
|
#- display sensor value in the web UI -#
|
||||||
def web_sensor()
|
def web_sensor()
|
||||||
|
if !self.wire return nil end #- exit if not initialized -#
|
||||||
import string
|
import string
|
||||||
var msg = string.format(
|
var msg = string.format(
|
||||||
"{s}MPU6886 acc_x{m}%f G{e}"..
|
"{s}MPU6886 acc_x{m}%.3f G{e}"..
|
||||||
"{s}MPU6886 acc_y{m}%f G{e}"..
|
"{s}MPU6886 acc_y{m}%.3f G{e}"..
|
||||||
"{s}MPU6886 acc_z{m}%f G{e}"..
|
"{s}MPU6886 acc_z{m}%.3f G{e}"..
|
||||||
"{s}MPU6886 gyr_x{m}%i dps{e}"..
|
"{s}MPU6886 gyr_x{m}%i dps{e}"..
|
||||||
"{s}MPU6886 gyr_y{m}%i dps{e}"..
|
"{s}MPU6886 gyr_y{m}%i dps{e}"..
|
||||||
"{s}MPU6886 gyr_z{m}%i dps{e}",
|
"{s}MPU6886 gyr_z{m}%i dps{e}",
|
||||||
|
@ -108,6 +102,7 @@ class MPU6886 : Driver
|
||||||
|
|
||||||
#- add sensor value to teleperiod -#
|
#- add sensor value to teleperiod -#
|
||||||
def json_append()
|
def json_append()
|
||||||
|
if !self.wire return nil end #- exit if not initialized -#
|
||||||
import string
|
import string
|
||||||
var ax = int(self.accel[0] * 1000)
|
var ax = int(self.accel[0] * 1000)
|
||||||
var ay = int(self.accel[1] * 1000)
|
var ay = int(self.accel[1] * 1000)
|
||||||
|
@ -118,5 +113,5 @@ class MPU6886 : Driver
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
mpu = MPU6886()
|
mpu6886 = MPU6886()
|
||||||
tasmota.add_driver(mpu)
|
tasmota.add_driver(mpu6886)
|
|
@ -23,21 +23,21 @@
|
||||||
#include <berry.h>
|
#include <berry.h>
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
|
||||||
// read the `_bus` attribute and return `Wire` or `Wire1`
|
// read the `bus` attribute and return `Wire` or `Wire1`
|
||||||
TwoWire & getWire(bvm *vm);
|
TwoWire & getWire(bvm *vm);
|
||||||
TwoWire & getWire(bvm *vm) {
|
TwoWire & getWire(bvm *vm) {
|
||||||
be_getmember(vm, 1, "_bus");
|
be_getmember(vm, 1, "bus");
|
||||||
int32_t bus = be_toint(vm, -1);
|
int32_t bus = be_toint(vm, -1); // bus is 1 or 2
|
||||||
be_pop(vm, 1);
|
be_pop(vm, 1);
|
||||||
if (0 == bus) {
|
if (2 != bus) {
|
||||||
return Wire;
|
return Wire;
|
||||||
} else {
|
} else {
|
||||||
return Wire1;
|
return Wire1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int32_t getBus(bvm *vm);
|
int32_t getBus(bvm *vm); // 1 or 2
|
||||||
int32_t getBus(bvm *vm) {
|
int32_t getBus(bvm *vm) {
|
||||||
be_getmember(vm, 1, "_bus");
|
be_getmember(vm, 1, "bus");
|
||||||
int32_t bus = be_toint(vm, -1);
|
int32_t bus = be_toint(vm, -1);
|
||||||
be_pop(vm, 1);
|
be_pop(vm, 1);
|
||||||
return bus;
|
return bus;
|
||||||
|
@ -57,15 +57,15 @@ extern "C" {
|
||||||
int32_t b_wire_init(struct bvm *vm);
|
int32_t b_wire_init(struct bvm *vm);
|
||||||
int32_t b_wire_init(struct bvm *vm) {
|
int32_t b_wire_init(struct bvm *vm) {
|
||||||
int32_t top = be_top(vm); // Get the number of arguments
|
int32_t top = be_top(vm); // Get the number of arguments
|
||||||
int32_t bus = 0;
|
int32_t bus = 1;
|
||||||
if (top > 1 && be_isint(vm, 2)) {
|
if (top > 1 && be_isint(vm, 2)) {
|
||||||
bus = be_toint(vm, 2);
|
bus = be_toint(vm, 2);
|
||||||
if (bus < 0) { bus = 0; }
|
if (bus < 1) { bus = 1; }
|
||||||
if (bus > 1) { bus = 1; }
|
if (bus > 2) { bus = 2; }
|
||||||
}
|
}
|
||||||
// store bus in instance
|
// store bus in instance
|
||||||
be_pushint(vm, bus);
|
be_pushint(vm, bus);
|
||||||
be_setmember(vm, 1, "_bus");
|
be_setmember(vm, 1, "bus");
|
||||||
be_return_nil(vm);
|
be_return_nil(vm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,7 +193,7 @@ extern "C" {
|
||||||
int32_t b_wire_validwrite(struct bvm *vm);
|
int32_t b_wire_validwrite(struct bvm *vm);
|
||||||
int32_t b_wire_validwrite(struct bvm *vm) {
|
int32_t b_wire_validwrite(struct bvm *vm) {
|
||||||
int32_t top = be_top(vm); // Get the number of arguments
|
int32_t top = be_top(vm); // Get the number of arguments
|
||||||
int32_t bus = getBus(vm);
|
int32_t bus = getBus(vm) - 1; // 0 or 1
|
||||||
if (top == 5 && be_isint(vm, 2) && be_isint(vm, 3) && be_isint(vm, 4) && be_isint(vm, 5)) {
|
if (top == 5 && be_isint(vm, 2) && be_isint(vm, 3) && be_isint(vm, 4) && be_isint(vm, 5)) {
|
||||||
uint8_t addr = be_toint(vm, 2);
|
uint8_t addr = be_toint(vm, 2);
|
||||||
uint8_t reg = be_toint(vm, 3);
|
uint8_t reg = be_toint(vm, 3);
|
||||||
|
@ -210,7 +210,7 @@ extern "C" {
|
||||||
int32_t b_wire_validread(struct bvm *vm);
|
int32_t b_wire_validread(struct bvm *vm);
|
||||||
int32_t b_wire_validread(struct bvm *vm) {
|
int32_t b_wire_validread(struct bvm *vm) {
|
||||||
int32_t top = be_top(vm); // Get the number of arguments
|
int32_t top = be_top(vm); // Get the number of arguments
|
||||||
int32_t bus = getBus(vm);
|
int32_t bus = getBus(vm) - 1; // 0 or 1
|
||||||
if (top == 4 && be_isint(vm, 2) && be_isint(vm, 3) && be_isint(vm, 4)) {
|
if (top == 4 && be_isint(vm, 2) && be_isint(vm, 3) && be_isint(vm, 4)) {
|
||||||
uint8_t addr = be_toint(vm, 2);
|
uint8_t addr = be_toint(vm, 2);
|
||||||
uint8_t reg = be_toint(vm, 3);
|
uint8_t reg = be_toint(vm, 3);
|
||||||
|
|
|
@ -284,6 +284,17 @@ const char berry_prog[] =
|
||||||
// "end "
|
// "end "
|
||||||
// "end "
|
// "end "
|
||||||
|
|
||||||
|
// // tasmota.wire_scan(addr:int [, index:int]) -> wire1 or wire2 or nil
|
||||||
|
// // scan for the first occurrence of the addr, starting with bus1 then bus2
|
||||||
|
// // optional: skip if index is disabled via I2CEnable
|
||||||
|
// "def wire_scan(addr,idx) "
|
||||||
|
// // skip if the I2C index is disabled
|
||||||
|
// "if idx != nil && !self.i2c_enabled(idx) return nil end "
|
||||||
|
// "if self.wire1.detect(addr) return self.wire1 end "
|
||||||
|
// "if self.wire2.detect(addr) return self.wire2 end "
|
||||||
|
// "return nil "
|
||||||
|
// "end "
|
||||||
|
|
||||||
"end "
|
"end "
|
||||||
|
|
||||||
// Instantiate tasmota object
|
// Instantiate tasmota object
|
||||||
|
@ -314,12 +325,10 @@ const char berry_prog[] =
|
||||||
// "end "
|
// "end "
|
||||||
// "end "
|
// "end "
|
||||||
|
|
||||||
"wire = Wire(0) "
|
"tasmota.wire1 = Wire(1) "
|
||||||
"wire1 = wire "
|
"tasmota.wire2 = Wire(2) "
|
||||||
"wire2 = Wire(1) "
|
"wire1 = tasmota.wire1 "
|
||||||
|
"wire2 = tasmota.wire2 "
|
||||||
// try to load "/autoexec.be"
|
|
||||||
// "try compile('/autoexec.be','file')() except .. log('BRY: no /autoexec.bat file') end "
|
|
||||||
;
|
;
|
||||||
|
|
||||||
const char berry_autoexec[] =
|
const char berry_autoexec[] =
|
||||||
|
|
Loading…
Reference in New Issue